From 3ff625483c00458ebcf54307fad16b1cc402ff32 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 25 Oct 2023 13:38:37 +0200 Subject: [PATCH] demos(render): start render demo --- demos/lv_demos.h | 4 + demos/render/README.md | 48 ++++++ demos/render/lv_demo_render.c | 280 ++++++++++++++++++++++++++++++++++ demos/render/lv_demo_render.h | 48 ++++++ demos/render/screenshot1.png | Bin 0 -> 12218 bytes demos/render/screenshot2.png | Bin 0 -> 15666 bytes docs/overview/style-props.md | 35 +++-- lv_conf_template.h | 7 +- scripts/style_api_gen.py | 14 +- src/core/lv_obj_draw.c | 5 +- src/core/lv_obj_style.c | 2 + src/core/lv_obj_style_gen.c | 27 ++-- src/core/lv_obj_style_gen.h | 54 +++---- src/lv_conf_internal.h | 15 +- src/misc/lv_style.c | 5 +- src/misc/lv_style.h | 33 +--- src/misc/lv_style_gen.c | 24 ++- src/misc/lv_style_gen.h | 19 ++- tests/src/lv_test_conf_full.h | 1 + 19 files changed, 509 insertions(+), 112 deletions(-) create mode 100644 demos/render/README.md create mode 100644 demos/render/lv_demo_render.c create mode 100644 demos/render/lv_demo_render.h create mode 100644 demos/render/screenshot1.png create mode 100644 demos/render/screenshot2.png diff --git a/demos/lv_demos.h b/demos/lv_demos.h index 9d45e6324c88..63f34dfc72fd 100644 --- a/demos/lv_demos.h +++ b/demos/lv_demos.h @@ -51,6 +51,10 @@ extern "C" { #include "multilang/lv_demo_multilang.h" #endif +#if LV_USE_DEMO_RENDER +#include "render/lv_demo_render.h" +#endif + /********************* * DEFINES *********************/ diff --git a/demos/render/README.md b/demos/render/README.md new file mode 100644 index 000000000000..6518490edee1 --- /dev/null +++ b/demos/render/README.md @@ -0,0 +1,48 @@ +# Benchmark demo + + +![LVGL benchmark running](screenshot1.png) + +## Overview + +The benchmark demo tests the performance in various cases. +For example rectangle, border, shadow, text, image blending, image transformation, blending modes, etc. +All tests are repeated with 50% opacity. + +The size and position of the objects during testing are set with a pseudo random number to make the benchmark repeatable. + +On to top of the screen the title of the current test step, and the result of the previous step is displayed. + +## Run the benchmark +- In `lv_conf.h` or equivalent places set `LV_USE_DEMO_BENCHMARK 1` +- After `lv_init()` and initializing the drivers and call `lv_demo_benchmark(mode)` +- If you only want to run a specific scene for any purpose (e.g. debug, performance optimization etc.), you can call `lv_demo_benchmark_run_scene(mode, scene_idx)` instead of `lv_demo_benchmark()`and pass the scene number. +- If you enabled trace output by setting macro `LV_USE_LOG` to `1` and trace level `LV_LOG_LEVEL` to `LV_LOG_LEVEL_USER` or higher, benchmark results are printed out in `csv` format. + + +## Modes +The `mode` should be passed to `lv_demo_benchmark(mode)` or `lv_demo_benchmark_run_scene(mode, scene_idx)`. + +- `LV_DEMO_BENCHMARK_MODE_RENDER_AND_DRIVER` Render the scenes and show them on the display. Measure rendering time but it might contain extra time when LVGL waits for the driver. Run each scenes for a few seconds so the performance can be seen by eye too. As only the rendering time is measured and converted to FPS, really high values (e.g. 1000 FPS) are possible. +- `LV_DEMO_BENCHMARK_MODE_REAL` Similar to `RENDER_AND_DRIVER` but instead of measuring the rendering time only measure the real FPS of the system. E.g. even if a scene was rendered in 1 ms, but the screen is redrawn only in every 100 ms, the result will be 10 FPS. +- `LV_DEMO_BENCHMARK_MODE_RENDER_ONLY` Temporarily display the `flush_cb` so the pure rendering time will be measured. The display is not updated during the benchmark, only at the end when the summary table is shown. Renders a given number of frames from each scene and calculate the FPS from them. + + +## Result summary +In the end, a table is created to display measured FPS values. + +On top of the summary screen, the "Weighted FPS" value is shown. +In this, the result of the more common cases are taken into account with a higher weight. + +"Opa. speed" shows the speed of the measurements with opacity compared to full opacity. +E.g. "Opa. speed = 90%" means that rendering with opacity is 10% slower. + +In the first section of the table, "Slow but common cases", those cases are displayed which are considered common but were slower than 20 FPS. + +Below this in the "All cases section" all the results are shown. The < 10 FPS results are shown with red, the >= 10 but < 20 FPS values are displayed with orange. + +![LVGL benchmark result summary](screenshot2.png) + + + +**NOTE**: Compared to the past, the use of rotation and zoom(scaling) in GUI applications has become increasingly common. Therefore, starting from LVGL9, we have assigned a higher priority to zoom(scaling) and rotation operations. diff --git a/demos/render/lv_demo_render.c b/demos/render/lv_demo_render.c new file mode 100644 index 000000000000..6fcf0ab67230 --- /dev/null +++ b/demos/render/lv_demo_render.c @@ -0,0 +1,280 @@ +/** + * @file lv_demo_render.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_demo_render.h" + +#if LV_USE_DEMO_RENDER +#include "../../src/display/lv_display_private.h" +#include "../../src/core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define COL_CNT 8 +#define ROW_CNT 8 +#define DEF_WIDTH 55 +#define DEF_HEIGHT 30 + +/********************** + * TYPEDEFS + **********************/ + +#define SCENE_TIME_DEF 2000 + +typedef struct { + const char * name; + void (*create_cb)(lv_obj_t * parent); +} scene_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void add_to_cell(lv_obj_t * obj, lv_coord_t col, lv_coord_t row); + + +static lv_obj_t * fill_obj_create(lv_obj_t * parent, lv_coord_t col, lv_coord_t row) +{ + lv_color_t colors[] = {lv_color_hex3(0x000), + lv_color_hex3(0xfff), + lv_color_hex3(0xf00), + lv_color_hex3(0x0f0), + lv_color_hex3(0x00f), + lv_color_hex3(0xff0), + lv_color_hex3(0x0ff), + lv_color_hex3(0xf0f), + }; + + lv_obj_t * obj = lv_obj_create(parent); + lv_obj_remove_style_all(obj); + lv_obj_set_style_bg_opa(obj, LV_OPA_COVER, 0); + lv_obj_set_style_bg_color(obj, colors[col], 0); + lv_obj_set_size(obj, DEF_WIDTH, DEF_HEIGHT); + add_to_cell(obj, col, row); + + return obj; + +} + +static void fill_cb(lv_obj_t * parent) +{ + + uint32_t i; + for(i = 0; i < COL_CNT; i++) { + fill_obj_create(parent, i, 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = fill_obj_create(parent, i, 1); + lv_obj_set_style_radius(obj, 10, 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = fill_obj_create(parent, i, 2); + lv_obj_set_style_radius(obj, 100, 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = fill_obj_create(parent, i, 3); + lv_obj_set_style_radius(obj, 10, 0); + lv_obj_set_style_bg_grad_dir(obj, LV_GRAD_DIR_HOR, 0); + lv_obj_set_style_bg_grad_color(obj, lv_color_hex3(0x888), 0); + lv_obj_set_style_bg_grad_stop(obj, 200, 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = fill_obj_create(parent, i, 4); + lv_obj_set_style_radius(obj, 10, 0); + lv_obj_set_style_bg_grad_dir(obj, LV_GRAD_DIR_VER, 0); + lv_obj_set_style_bg_grad_color(obj, lv_color_hex3(0x888), 0); + lv_obj_set_style_bg_grad_stop(obj, 200, 0); + } + + for(i = 0; i < COL_CNT; i++) { + + lv_obj_t * obj = fill_obj_create(parent, i, 5); + lv_obj_set_style_radius(obj, 10, 0); + lv_obj_set_style_bg_grad_dir(obj, LV_GRAD_DIR_HOR, 0); + lv_obj_set_style_bg_grad_color(obj, lv_color_hex3(0x888), 0); + lv_obj_set_style_bg_grad_opa(obj, LV_OPA_TRANSP, 0); + lv_obj_set_style_bg_grad_stop(obj, 200, 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = fill_obj_create(parent, i, 6); + lv_obj_set_style_radius(obj, 10, 0); + lv_obj_set_style_bg_grad_dir(obj, LV_GRAD_DIR_VER, 0); + lv_obj_set_style_bg_grad_color(obj, lv_color_hex3(0x888), 0); + lv_obj_set_style_bg_grad_opa(obj, LV_OPA_TRANSP, 0); + lv_obj_set_style_bg_grad_stop(obj, 200, 0); + } +} + +static lv_obj_t * border_obj_create(lv_obj_t * parent, lv_coord_t col, lv_coord_t row) +{ + + lv_obj_t * obj = lv_obj_create(parent); + lv_obj_remove_style_all(obj); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x000), 0); + lv_obj_set_style_border_width(obj, 3, 0); + lv_obj_set_size(obj, DEF_WIDTH, DEF_HEIGHT); + add_to_cell(obj, col, row); + + return obj; + +} + +static void border_cb(lv_obj_t * parent) +{ + lv_border_side_t sides[] = { + LV_BORDER_SIDE_NONE, + LV_BORDER_SIDE_FULL, + LV_BORDER_SIDE_LEFT, + LV_BORDER_SIDE_RIGHT, + LV_BORDER_SIDE_TOP, + LV_BORDER_SIDE_BOTTOM, + LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_RIGHT, + LV_BORDER_SIDE_RIGHT | LV_BORDER_SIDE_BOTTOM, + LV_BORDER_SIDE_LEFT| LV_BORDER_SIDE_BOTTOM, + LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_TOP, + LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_RIGHT, + LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM, + LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_RIGHT | LV_BORDER_SIDE_BOTTOM, + LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_TOP, + LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_RIGHT | LV_BORDER_SIDE_TOP, + LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT | LV_BORDER_SIDE_TOP, + }; + + uint32_t i; + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 0); + lv_obj_set_style_radius(obj, 0, 0); + lv_obj_set_style_border_side(obj, sides[i], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0xf00), 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 1); + lv_obj_set_style_radius(obj, 0, 0); + lv_obj_set_style_border_side(obj, sides[i + 8], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0xf00), 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 2); + lv_obj_set_style_radius(obj, 10, 0); + lv_obj_set_style_border_side(obj, sides[i], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x0f0), 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 3); + lv_obj_set_style_radius(obj, 10, 0); + lv_obj_set_style_border_side(obj, sides[i + 8], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x0f0), 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 4); + lv_obj_set_style_radius(obj, 100, 0); + lv_obj_set_style_border_side(obj, sides[i], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x00f), 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 5); + lv_obj_set_style_radius(obj, 100, 0); + lv_obj_set_style_border_side(obj, sides[i + 8], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x00f), 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 6); + lv_obj_set_style_radius(obj, 100, 0); + lv_obj_set_style_border_side(obj, sides[i], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x888), 0); + lv_obj_set_style_border_width(obj, 10, 0); + } + + for(i = 0; i < COL_CNT; i++) { + lv_obj_t * obj = border_obj_create(parent, i, 7); + lv_obj_set_style_radius(obj, 100, 0); + lv_obj_set_style_border_side(obj, sides[i + 8], 0); + lv_obj_set_style_border_color(obj, lv_color_hex3(0x888), 0); + lv_obj_set_style_border_width(obj, 10, 0); + } +} + +/********************** + * STATIC VARIABLES + **********************/ +//fill (radius + gradient too) +//border (each sides + radius) +//outline (radius) +//box shadow (offset, size, spread) +//text (normal text + underline/strike through, placeholder) +//triangle (just some rectangles) +//image (various formats + transformation) +//line (various angles + line caps) +//arc (some arcs + caps) +//vector (later) +//layer (blend mode, transformation) +//mask bitmap (not implemented SW render yet) +//mask rectangle + +static scene_dsc_t scenes[] = { + {.name = "Fill ", .create_cb = fill_cb}, + {.name = "Border", .create_cb = border_cb}, + + {.name = "", .create_cb = NULL} +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_demo_render(uint32_t idx) +{ + + lv_obj_t * scr = lv_screen_active(); + lv_obj_clean(scr); + lv_obj_remove_style_all(scr); + lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0); + lv_obj_set_style_text_color(scr, lv_color_black(), 0); + lv_obj_set_style_bg_color(scr, lv_color_white(), 0); + + lv_obj_t * main_parent = lv_obj_create(scr); + lv_obj_remove_style_all(main_parent); + lv_obj_set_style_bg_opa(main_parent, LV_OPA_COVER, 0); + lv_obj_set_style_bg_color(main_parent, lv_color_hex3(0xaaf), 0); + lv_obj_set_size(main_parent, 480, 272); + + static const lv_coord_t grid_cols[] = {60, 60, 60, 60, 60, 60, 60, 60, LV_GRID_TEMPLATE_LAST}; + static const lv_coord_t grid_rows[] = {34, 34, 34, 34, 34, 34, 34, 34, LV_GRID_TEMPLATE_LAST}; + lv_obj_set_grid_dsc_array(main_parent, grid_cols, grid_rows); + + + if(scenes[idx].create_cb) scenes[idx].create_cb(main_parent); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void add_to_cell(lv_obj_t * obj, lv_coord_t col, lv_coord_t row) +{ + lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_CENTER, col, 1, LV_GRID_ALIGN_CENTER, row, 1); +} + + +#endif diff --git a/demos/render/lv_demo_render.h b/demos/render/lv_demo_render.h new file mode 100644 index 000000000000..7e63ed68c637 --- /dev/null +++ b/demos/render/lv_demo_render.h @@ -0,0 +1,48 @@ +/** + * @file lv_demo_render.h + * + */ + +#ifndef LV_DEMO_RENDER_H +#define LV_DEMO_RENDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_demos.h" + +#if LV_USE_DEMO_RENDER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Run the render verification for a scenario + * @param idx index of the scenario to run + */ +void lv_demo_render(uint32_t idx); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DEMO_RENDER*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_DEMO_RENDER_H*/ diff --git a/demos/render/screenshot1.png b/demos/render/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..845f2be62a211dfc91b5f5339b6acce9081d1e77 GIT binary patch literal 12218 zcmeHtcQBl9+x8Mdf{2I^1W}V%CDD5%Li8Z3uM)j?s}m&=HBqDIM+nwp$!e>GAR-81 zS6M`h-dptVlHdEy`#kS6-^?@bKi|wd@0zi*ce}3pypHocj`O(hS5GvQs4g;Igg_uv z%8wPaA&_%y5D3vva$>Nh-zqy7e4X=np!}4aoP2ar^C$Ru-Sd&Yr;dxYC&Jv_3S#5z z;$+3=Vc~9N@U$Rq<^Q-|lg4HFpzGVd`)1o1!ot=A7LSkaowYB?0xzU($W$I1x2@YrAb*?Nr{?pKW9$g}#S}2RK+&Rh5Z}X~!=xFtA~Xp}xL;Srqf}Fy|07A z;jC?J#KgqNI3PPs)|It2HTuZGs;Vl2QGk1=)bxvF1OjnPM*+Ft8{THRxZ{T$G&C~m zN`*q9j?T``j*eILMhOJM`1tt9h@{tLK~`2rVMZ(#+cxdoV1jt#U}e>Yss*2l3hjWl z4ntGZoUE*|;o;6y!QrJeH<<{2ysZ5N2*k&TS{J3e^i^_eYio0zZBaO*dv7OK7o%x;h^} z|20~06NV-xvK9mG2n1e64@OTTQTGCZ8zsAuWwaCE!@j!Qk$T2z@}8>h>aYsASz9Zy zN0{=4Kx#fOrx{D%;ZMuTLJiu-8%|I$uCA;YIKbUUz|FFbjgEGi4jk84RJbpCI}>Vd zvR77C@~{>U+Ot<+FkXwa@QJsP-+Ft&nnL;bUOh&e(Qg`8r#X!E_iLZb?=0cR4xCA= zDeWFn&F|La$H@IEZ)0A1~0P+PVo}4cX4rXckd_dj*X24ajPGx=W~u3#I!X` zEiW&(x4$r&JVJRa zd4E8R9um?uRT45A7uiNR6BoMr8^meOdi-jRb{T$dZf>lX|G}U=W(i-mwz9IaygZZl z7$gJ#gW9Cmdvb$IJJRoJ@^(6ly}i8&2Z@P^JAMsFh@LsxI@Q0_v}rZSOKJPrr?$+= z7I`;Pyip2Si4y9k3Sax}R1q5+o2?uDm%RHX`R!W`?;mAG?eaMpKQOf*Qnq z^vdvXg)h~=>h6k)if+or2-S5&5e7=7?Pm8oo!-CwX57Qup2SYyWX$iz<%Rje=cy@Y zK}zoi0N>bQjDvbF&;|F@j)}|3tv$2d_$$%L&FI!O*Av{Z2T4hX=sKEcNvr#|Gw0la zxaQa;2qbl60sqO}!wRGp{AGA$dHECMU`k3#I!N4MPg(~A) z{-D?}^VckHA-!Zpk&_i0nxXNu3=a}^%sy6;Bd6$Bsf^p=>?eE7NPD}Y?24VWb-~gD zI-XH&=)w_7D*kNZEQ8F|vu$mU_*`{9iz^X91bs9v=&!P^yx85$JN)&lpi5hbx|V{! zq_p%`YS##X@QsI$4lH}X{_bv77c<7NJN7yqUQXh}3HsOE99*tjB1c3_3~!GC6$Iei z4cyDrRewEYymwSn9bFwi*H2y7+nn(_{IHqIcZB*N`dW>YkKhBKMQn@GH8L^j={@J8 zZS!$enq{t96xr;M1sj59)u#6X} zo@UT9iv|-HVa7I9RGoF*poYv&zsL{u$L=@WHLu?79j@CF*F49%H1KPN=QZx)``4p& zbyFbQ2gbc`KvPQ%Q8Z9ye9DW zBM3)BgN%^SbdSg=s4oOUW=;;MgkH&>@U^cE^9N_2x{Q?>6Z}q87LR6)bLGyCmsm2k z&(^aIgF>Oe%7Y>bVA0vx+1=e;y2@M~iZoClU>eWh>{AVDda3d2_|iIadA+U91jg8Q zzy}T*K~&LOAJTa2$9$!$p4&*}N$jVL&D4SkDCWH}yV=hgG6rMmmS>@%{m z_%t?Ty;iI01D%6dOgAUnraBQ)Qc`Vn#zN5ole(@VSUY>Tz?}6eeQHgyMrqpG^8f)l zF`o)P{*PWxa{!9H2H`eh>*z#6uWj6@dysu-1_~Ac7kfW%vOPfim9WY$tDpXfj z2Q$i&Q6Psv1SvJ-qSuw3TwJORQ6FmQZUE+PUdM$29*1;jQUeNyxRXG^|6X!^@ITv& ztVA*IFPBu)!sA?2X=!nB2bCyeY+BlNm=}GPfcBtbUY|YYsYp{lEU)h^DD``Qo6pF( zN8tBDgXms=uXTsX$Elu;#yn}s9d)^f8(V^6VsoXGsS_{ewU{LK>7Uj+^+}vI_WZs@ z4B?MhAIRU&j{*FIz37|QH(&Q_?vY1o31N76p-yC6LL{Rb||F zYcQ#QTXWbxK_JvCq}ICsRqQkQJGb-YCKsT0IDOn)6(9ZNfRu?G6VJr9lASPPMn(oN zFE5Y4tsK*zC(9v&JM^BrdGKJ zUQe0FTwjt^m)8tiS1u?zX*5m&;s-E0l!uM=^3>kjl+Ubh0gQ-fO0UdWok4tBl4Q@8 zX26b`&7t^Nc0saiZn}>z>bSg}&t6)T7%ti^tO7EkrfMc7H5Gekk;6$3ll|)B4P>sw!+u0T?1(b3OLK*c5*UZ_4mQs?4b1R zFlV~e4gi?!@9!rkC+i|-opt7&-*d44k!V7!KMYJwT`-3GZ#7Jc{U!7kB}M^t!XaM~ zdC~9Nj2y%msSs;T0bw>xG^>3ewe$12#E3BuyRUiCd`>^b?9M?YSY8=-V7haE*TO8qU&%|Go#d}$qSYzv;i zzBI0mTDqwZhkJ?j`hHzUyhyZ)jAZ&D;ZL%tMWA|74YFo#4v3bqpN9B?D1o_4jVOhQ1?dJHb>$H2o) z*YY8%T{^tPod1Z3`<&#YF;mXRo>FHy9@fX8lp7lvVS|qA4t;W@>31kWwg|cC1$^9p za;8A`UK_5xHCS@^#AB1$iGUpmkZ?T{+pA`{On4;9ltU4efKEoksY@C^u)gA0*x&ag;4^L#x zOTxEoT_mQVp#fkLbQOw{gp$;$1I@&6fkXvo#0q1PiT5*%oV zssgYxY3Q?^5h{Tf!AB+17mGb zoy}acs~lcF5HX!xSn|wp=SXf71_<&7?ShR0`e?1I;rnpT5YI8d%)zIHhv8uR&P&kS zh>D4A(OeWO21#sBsx3}ZcXc*y)|vaY6tvdjq1)42thqsn*Umt8fm z3bmhP>5~;cQ&H5VYo>U%Gi|(Q8Li`ahLV}?+p7OCIywqkM}V)au3>u&LDsilGNbz! zKslc712f`UF)xs)wQ1TQz`gIzE!>s^=nm==SvVf3%p~~2+A6Do;y12Kc=;ocunFLC zbZ2nYvUREeh`~3#*8m_8WK~L8kLIJ?GTeUzX=?OMfc{8qXva{~@7iQ6lUS7AL^jY9 z**1v9PB(4wtuB#n8GP(Q%98_P2eS7wJE_FQ(g)UMa9eRLR)kuk~(D5 ztEXb(*&#o*pZHtH6MvTjeL5bG-~SANG*MeR1H^pD7Ka%y34Gcw-#qgLw*UN4Yz9uq z`tk<;6S3>{1|Na_tkk&13cT<1ttCtPojY&7V)TRDTaH?=-^diVKWU4tH5W4E$+LmK zcQ1l_h#1(veIh>J9h7i9TDBH^u(K-^G}dGyag@x9K(8y!+5wu9q^%ZIbs6RtkQd# zG4ZOkYVE{=>*V^)KYe`V#{4!4t3{4_;sdtx@WIm&qh+cL_O*`O?LUxut$R&!Lldc- z7oH9>Fm=Sx5i>ZFK+Rl_J|Sf^^mAZvcQrloaf))vurS8%PO)KJ_vi511K=3-Z@BTLMyz>eYGMP| zm4c7fnhwW$x9eW3a(7E2RvW$NRvjjO_pmmeE^3}^lLgZ#DuZhThIzj0w|$dx!s zF5nYUjhTV<=!#>o9M*#e8z_ZsV*MEJl)gBfbK%RJ?B2v9l_uEfJAz5|AcOdo3ZZw>}lsw$4Fs zq%M+@4;?Hd;BasMCNQ;3m84VKN~lBi=-%oL%Z^H;?hk0c%~T&HlmJ%pvPB|7tz{W8Xqk4!RfVzbnw+ zMF+YJJj)lV$epk;&49%vm%x?S!!oW;x3VsI(?fLAkx&D_`MSZIu&~kUrrkIUz>wyyB8*GW{^_~Ab|3$~p!?0l z>oJz1$Gg=h6ZB0x6B9M;2xP+V!}Da{s}p8^qcX(C>wKqsPiC5q<~5H{@y9K4@m&@; zLzswS>;38PN$fiOr1{?|wZE~O5&0-OH|+PLerFrsccURNQ*zR2;qG+!CzQBBA0sXn5^xS>TF~6P4oZ*wyWLA@l zG2zcu^(MD{0#;N4c2uNAbQzNc<3fqP=!3xZKKS4P%{QSZdPmLNu(?!b&5Ft2BYocf z#*GLm0+$fi_%Tpis5SWAco+SE_*w{sjXxX`(wI=cUxc3uzRd9IfzEAG|2?U__ympg zB9*J@f(+pjYiA3xt_G7dZOZVDiMq=e@$0AfiswDLR~$mxmw5Bp;`ool5oZhRQ&7B_ z9%-ptF<@yzc8@Xvx}Zw+RPE+&Emucza@;X z5$gN{mYfgA&D{ygl_f7p{lE%9APq?d3-5;~wcOX(YW=@Uh^ve$rvL|Sm;219-quea z(Xfw~T$pt8BPdI~>V}?e{drsejc}#1z0@mp?F{SPggM@`dCiMBv>7^})K|h9kzLv4 zf49W{3ax(&ixmFwW;4HywqK_wS*QE60>KNhVkT>zk`4T1tu05>6N_HJ(4`?xK^z_) zo*qmbMQa8h#QVcR&pv;hI7Kr{V@@x4Cue0js1Y9l2sL~EcZXaLGc+e?1%E=ja1j!6 zQ%puiy?OK3Y^v!&EXs7viw**L*AW*Ve?fmdU{NP$`D}o9d;P*(X1-hb0>NlJ7r4&2 z4vaWOtgL?1y$rbJkOrmZO}pS=kmhIm{xN_4zDd@9@cK0=X+W@j{!Xud-2K5Gqw*(7 z7Y-**W&fPSeET(D#-}*-8+V=Zt$o}D(yK> z1m*94)jRP##Vxt`tDzzb4e5C8Vg5QdLr(4v5Frz*5T*w|QjI2-ylz7HpR>g%a+k%a znFRJK1^vRf1g$s(uVa<5e7cWNQ7}xqrM=jKD?u=&KM5PNR=dWlZZswFFYQMvIK*WQ`t59ZQv08aN-d8^*lNFVdBJ5 zX)&x@?KO9nc6vCDkxnbI$dK0asZ&`O$$AMmyv}!Rr=yGn62FyAt?^-DuPy7rTWbSG zLkESnw*w@~X4)b}7|N@}4{aWw!yV^IHSiNPv%L*yypzlR45iPck7U;sp$OApz_b?L zAbIsxEnEX?RztZEp(thW0bq)OWcJNbP7%L#ns97C=c4D-d)g1mZ>`!556VLR5_%7y z!XMJ5pKfiQuBd#)%HXX52T%vUFPB4_IWV}PZMF^8P^rbp5Ige5bIrTeQSk^ zx+SCEd>Pct5EtFgQFL@&bc`W4AN}`e;@`^Uf6a^kCtClT)#86g_){VNH?03y`Ti$j zX}d^R*$+riiRJCOQ1ic4>29An=$OP^(5g8!fQH{`-WYEfUAl5UHfYTo?6?MEazCeT z3zq>T+xK~TlO?YUt)S0?%-$nJf0)J{MBGl>=s~UC&aa>{z^c|e*QPX`~Aq=fZUfu|*8YJ-RjZLR_q66O|y-s)Pishfp zelqEf8G7RMj=yJW;cUH+Rk(x_A`%o6l7Gb;9YP?~@@MY?a8e91(%iJzpY+ZXNr*^K z=8WZ};L4-zqWu#t13D&KMtf}>C+_2WgIktRfr|?&{R!M?ZYy;-&o!bhGVa=Qkb~qX zD$dyVI=J%U0*>^eNRb~yvIe}y3lp*Y&O9L$rt|NgQ+X9|^ER0*a0-+4WEs+7fye|i+Tm%kKdbTaK z$qlr7ka?wtjOF7(C(lh%A!e5Yj)lth{_okgcFTs_CnkDCKiv;2HR}ibj?3||zfVw@ zi733r4D*MRhIB3Zn~ohWy9Ae=?bK;yDvwG3joaEYnbi0Tl08%{i`b$)o$Rela(H!4 zeC)}@9VL{nQ%BH-PMPts*#cZBZ~Dhd=3xw$TUGuB$ZcmFoyD>*-F_6fYMH34`SQL0I?pXj) zC35{V;M|Mvug^ni-)i43e%fU*J=lk~$1o~s*;1N@L9$=a(ZHDAa*|7$58dUyo8A{j zO8J*Lm45qYH(^P`v~-r7^z6598E#zXOGHDYNmENJ*ye%qii&HU7bmCPGJAKq+4XwA z@@l*7?Ks5_WG_4;U~+74bwWzq8BvmaeE2d;Bf-ibrFQKr&le+Hc2FDH;m_da%i45w zG<~0%SfYS@3T1nx(vknW{3@$LpB97X!21AF$U|G(b1AQKT|GZ;5uOw#?ymD#ZSdOq@0!Gd zqV8qdK)&(Qo^iYA*zOj#*ii$XHyoOnbI1H&+Eo@r(A3;FKU>JnJIT;@L=_v-A-Snq zIHTfJ^TTTDO{1uD%bh~QH{{L4fh={;(&yly^Y1=y{sfg$rWT6D+ZWyc>y^Yd`?!w+1sv&xDr&xr&@y^(k>V@~>VVUO#) z6f0Hijt^)(NcOcZHm@9s-wRu!y-UZ#Jc! zWG$*%`OSK_vzJ|1es1OguVSczTCu&tSJ4~EmJb{s^IUtOVk`+7E_yXqW1^)`D{jC8 zc)>!nL_}YiZH*|D@VetrEYCv`ukMpX>SR%p{G>wv^J}!Abg1A0=+f5J?&^B=Y2WQ& zWO-bapP!d}G1AhQkqi55rHyIe~qC8i?otKbYQurR$`2hXPyq(L@ z{7IhPNW`bM4yI;7b~CuNI+u9= zd|c8)bh~ZG3o_BV+|J1EXXxkparYU_zM|rYC~p$uB0RG6udE_#%DryoOO0fI?2Ih1 z>U==+u({=@Hb0WWjGU%Cn{@D7dR+M7qF<#7!tq|Qok7K8N4AuZ2%>^k*AF(3`3KE@ zicf_cMskbNtHKY{F^;-^-vh0#Km7D_YMRRI7P!I<7;n11dfUe~M!GH67vRklhFc^h zHtK^>1?+ZZ6rew(kD!SCuN~+AD#ZWk3h|#Q_CH=T{Qq>*HLiBo&S*W5^NoF(YK<$H z27T$+tF!)E)}0Ml(%}?J&BU&gyYU@oDnQm`qmK)j?e-tv8V8bKyDVc**0uUL z;Or0!|IIgR3lqTL=_MxW%AgLO;Q+E?-cwVY!Cl0ro*0*ww#x!^9F2AET*gL(mdq2C0=BQQeEBnZFE@YburUiph zJ&i4nEHqgyBY#02c+l2nnz@fYb1M$ss1%6OW~2)WnePg^6NN-ZMv(x=Gw(_3{c|3} zTXaNSNI^>a)4mD+)0gK@XUKoPDztnigjTkDPaDruoOb6rMYAb6aV#;Pl04U?saugP zWXJlc^bfMuDi#*z?lq<-i(=*3;|=4D4rW!{Yh%}M4yH#M&Ylbq)=Xq zeENc~az{sB{L6I9G(P7g3to&hkGvdrm-}L_`%{)zO33^-;>FBWdpa40_pY(!rjr&} zw6=<0QW%&;2^Q6jLwOb3!ntEwv~R~u3sQ#N68w}e7f;@7S3;M^NW!ROU2;VuzGE%B zw0_NSN9IRzXP-9LCH_Ma=uId` zD%?xacW7mUrWPZp4PUMtd-wOSeCuF*9e-(ExCF!gT!n!&U!3teQcWY?1S@%Rv^}(? zr&w?&|BYZ|On)FLCAR}Ak|D473WHaJ!8uwKGjNfqrO?H?oPykOcPwUk5!6Ox9eeSK zdBUm{Pz#LHB! ze%8ky8gZB6_NYhp;B|}A^Peif6JB=qXRtxr%Mo0u=;Hi7dui>9U0RplltPTXNlGZ* z41a4Y(EvuhRMy8VYh`O8wC?;TVgkok_KhjVreP9;)e*jWg2u%P0 literal 0 HcmV?d00001 diff --git a/demos/render/screenshot2.png b/demos/render/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0023b60f6448f824ec3620b251f94de5513b83 GIT binary patch literal 15666 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
  • Default 0
  • Inherited No
  • @@ -318,19 +318,28 @@ Set the point from which the background's gradient color should start. 0 means t
  • Ext. draw No
  • -### bg_grad -Set the gradient definition. The pointed instance must exist while the object is alive. NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors too. +### bg_main_opa +Set the opacity of the first gradient color
      -
    • Default `NULL`
    • +
    • Default 255
    • +
    • Inherited No
    • +
    • Layout No
    • +
    • Ext. draw No
    • +
    + +### bg_grad_opa +Set the opacity of the second gradient color +
      +
    • Default 255
    • Inherited No
    • Layout No
    • Ext. draw No
    -### bg_dither_mode -Set the dithering mode of the gradient of the background. The possible values are `LV_DITHER_NONE/ORDERED/ERR_DIFF`. +### bg_grad +Set the gradient definition. The pointed instance must exist while the object is alive. NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors too. If it's set other gradient related properties will be ignored'
      -
    • Default `LV_DITHER_NONE`
    • +
    • Default `NULL`
    • Inherited No
    • Layout No
    • Ext. draw No
    • @@ -433,7 +442,7 @@ Sets whether the border should be drawn before or after the children are drawn. Properties to describe the outline. It's like a border but drawn outside of the rectangles. ### outline_width -Set the width of the outline in pixels. +Set the width of the outline in pixels.
      • Default 0
      • Inherited No
      • @@ -481,7 +490,7 @@ Set the width of the shadow in pixels. The value should be >= 0.
      ### shadow_ofs_x -Set an offset on the shadow in pixels in X direction. +Set an offset on the shadow in pixels in X direction.
      • Default 0
      • Inherited No
      • @@ -490,7 +499,7 @@ Set an offset on the shadow in pixels in X direction.
      ### shadow_ofs_y -Set an offset on the shadow in pixels in Y direction. +Set an offset on the shadow in pixels in Y direction.
      • Default 0
      • Inherited No
      • @@ -586,7 +595,7 @@ Set the gap between dashes in pixel. Note that dash works only on horizontal and
      ### line_rounded -Make the end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending +Make the end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending
      • Default 0
      • Inherited No
      • @@ -625,7 +634,7 @@ Set the width (thickness) of the arcs in pixel.
      ### arc_rounded -Make the end points of the arcs rounded. `true`: rounded, `false`: perpendicular line ending +Make the end points of the arcs rounded. `true`: rounded, `false`: perpendicular line ending
      • Default 0
      • Inherited No
      • @@ -682,7 +691,7 @@ Set the opacity of the text. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully
      ### text_font -Set the font of the text (a pointer `lv_font_t *`). +Set the font of the text (a pointer `lv_font_t *`).
      • Default `LV_FONT_DEFAULT`
      • Inherited Yes
      • diff --git a/lv_conf_template.h b/lv_conf_template.h index ae3e75828db2..c8a5246f020b 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -810,10 +810,9 @@ /*Benchmark your system*/ #define LV_USE_DEMO_BENCHMARK 0 -#if LV_USE_DEMO_BENCHMARK - /*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ - #define LV_DEMO_BENCHMARK_RGB565A8 0 -#endif + +/*Render test for each primitives. Requires at least 480x272 display*/ +#define LV_USE_DEMO_RENDER 0 /*Stress test for LVGL*/ #define LV_USE_DEMO_STRESS 0 diff --git a/scripts/style_api_gen.py b/scripts/style_api_gen.py index 0170563214bc..af6c1660f0f5 100755 --- a/scripts/style_api_gen.py +++ b/scripts/style_api_gen.py @@ -145,13 +145,17 @@ 'style_type': 'num', 'var_type': 'lv_coord_t', 'default':255, 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'dsc': "Set the point from which the background's gradient color should start. 0 means to top/left side, 255 the bottom/right side, 128 the center, and so on"}, +{'name': 'BG_MAIN_OPA', + 'style_type': 'num', 'var_type': 'lv_opa_t', 'default':255, 'inherited': 0, 'layout': 0, 'ext_draw': 0, + 'dsc': "Set the opacity of the first gradient color"}, + +{'name': 'BG_GRAD_OPA', + 'style_type': 'num', 'var_type': 'lv_opa_t', 'default':255, 'inherited': 0, 'layout': 0, 'ext_draw': 0, + 'dsc': "Set the opacity of the second gradient color"}, + {'name': 'BG_GRAD', 'style_type': 'ptr', 'var_type': 'const lv_grad_dsc_t *', 'default':'`NULL`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, - 'dsc': "Set the gradient definition. The pointed instance must exist while the object is alive. NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors too."}, - -{'name': 'BG_DITHER_MODE', - 'style_type': 'num', 'var_type': 'lv_dither_mode_t', 'default':'`LV_DITHER_NONE`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, - 'dsc': "Set the dithering mode of the gradient of the background. The possible values are `LV_DITHER_NONE/ORDERED/ERR_DIFF`."}, + 'dsc': "Set the gradient definition. The pointed instance must exist while the object is alive. NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors too. If it's set other gradient related properties will be ignored'"}, {'name': 'BG_IMAGE_SRC', 'style_type': 'ptr', 'var_type': 'const void *', 'default':'`NULL`', 'inherited': 0, 'layout': 0, 'ext_draw': 1, diff --git a/src/core/lv_obj_draw.c b/src/core/lv_obj_draw.c index 3d3a5265d6be..9cc0b11aad63 100644 --- a/src/core/lv_obj_draw.c +++ b/src/core/lv_obj_draw.c @@ -71,10 +71,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t draw_dsc->bg_grad.stops[1].color = lv_obj_get_style_bg_grad_color_filtered(obj, part); draw_dsc->bg_grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, part); draw_dsc->bg_grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, part); - draw_dsc->bg_grad.stops[0].opa = 0xFF; - draw_dsc->bg_grad.stops[1].opa = 0xFF; + draw_dsc->bg_grad.stops[0].opa = lv_obj_get_style_bg_main_opa(obj, part); + draw_dsc->bg_grad.stops[1].opa = lv_obj_get_style_bg_grad_opa(obj, part); } - draw_dsc->bg_grad.dither = lv_obj_get_style_bg_dither_mode(obj, part); } } } diff --git a/src/core/lv_obj_style.c b/src/core/lv_obj_style.c index 75ea049ad4c1..8ed6fe94dc6e 100644 --- a/src/core/lv_obj_style.c +++ b/src/core/lv_obj_style.c @@ -344,6 +344,8 @@ static inline lv_style_value_t lv_style_prop_get_default_inlined(lv_style_prop_t case LV_STYLE_BORDER_OPA: case LV_STYLE_TEXT_OPA: case LV_STYLE_IMAGE_OPA: + case LV_STYLE_BG_GRAD_OPA: + case LV_STYLE_BG_MAIN_OPA: case LV_STYLE_BG_IMAGE_OPA: case LV_STYLE_OUTLINE_OPA: case LV_STYLE_SHADOW_OPA: diff --git a/src/core/lv_obj_style_gen.c b/src/core/lv_obj_style_gen.c index 4cfc9b874d11..c64f229ad99d 100644 --- a/src/core/lv_obj_style_gen.c +++ b/src/core/lv_obj_style_gen.c @@ -282,20 +282,28 @@ void lv_obj_set_style_bg_grad_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_ lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_STOP, v, selector); } -void lv_obj_set_style_bg_grad(struct _lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector) +void lv_obj_set_style_bg_main_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) { lv_style_value_t v = { - .ptr = value + .num = (int32_t)value }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD, v, selector); + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_OPA, v, selector); } -void lv_obj_set_style_bg_dither_mode(struct _lv_obj_t * obj, lv_dither_mode_t value, lv_style_selector_t selector) +void lv_obj_set_style_bg_grad_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) { lv_style_value_t v = { .num = (int32_t)value }; - lv_obj_set_local_style_prop(obj, LV_STYLE_BG_DITHER_MODE, v, selector); + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad(struct _lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD, v, selector); } void lv_obj_set_style_bg_image_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector) @@ -658,8 +666,7 @@ void lv_obj_set_style_opa_layered(struct _lv_obj_t * obj, lv_opa_t value, lv_sty lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector); } -void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, - lv_style_selector_t selector) +void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) { lv_style_value_t v = { .ptr = value @@ -699,8 +706,7 @@ void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_styl lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_SPEED, v, selector); } -void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, - lv_style_selector_t selector) +void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector) { lv_style_value_t v = { .ptr = value @@ -772,8 +778,7 @@ void lv_obj_set_style_flex_grow(struct _lv_obj_t * obj, uint8_t value, lv_style_ lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_GROW, v, selector); } -void lv_obj_set_style_grid_column_dsc_array(struct _lv_obj_t * obj, const lv_coord_t * value, - lv_style_selector_t selector) +void lv_obj_set_style_grid_column_dsc_array(struct _lv_obj_t * obj, const lv_coord_t * value, lv_style_selector_t selector) { lv_style_value_t v = { .ptr = value diff --git a/src/core/lv_obj_style_gen.h b/src/core/lv_obj_style_gen.h index ab46221b08de..281e47d1c935 100644 --- a/src/core/lv_obj_style_gen.h +++ b/src/core/lv_obj_style_gen.h @@ -208,8 +208,7 @@ static inline lv_color_t lv_obj_get_style_bg_grad_color(const struct _lv_obj_t * static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_BG_GRAD_COLOR)); + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR)); return v.color; } @@ -231,16 +230,22 @@ static inline lv_coord_t lv_obj_get_style_bg_grad_stop(const struct _lv_obj_t * return (lv_coord_t)v.num; } -static inline const lv_grad_dsc_t * lv_obj_get_style_bg_grad(const struct _lv_obj_t * obj, uint32_t part) +static inline lv_opa_t lv_obj_get_style_bg_main_opa(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD); - return (const lv_grad_dsc_t *)v.ptr; + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_OPA); + return (lv_opa_t)v.num; } -static inline lv_dither_mode_t lv_obj_get_style_bg_dither_mode(const struct _lv_obj_t * obj, uint32_t part) +static inline lv_opa_t lv_obj_get_style_bg_grad_opa(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_DITHER_MODE); - return (lv_dither_mode_t)v.num; + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_grad_dsc_t * lv_obj_get_style_bg_grad(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD); + return (const lv_grad_dsc_t *)v.ptr; } static inline const void * lv_obj_get_style_bg_image_src(const struct _lv_obj_t * obj, uint32_t part) @@ -263,8 +268,7 @@ static inline lv_color_t lv_obj_get_style_bg_image_recolor(const struct _lv_obj_ static inline lv_color_t lv_obj_get_style_bg_image_recolor_filtered(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_BG_IMAGE_RECOLOR)); + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR)); return v.color; } @@ -288,8 +292,7 @@ static inline lv_color_t lv_obj_get_style_border_color(const struct _lv_obj_t * static inline lv_color_t lv_obj_get_style_border_color_filtered(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_BORDER_COLOR)); + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR)); return v.color; } @@ -331,8 +334,7 @@ static inline lv_color_t lv_obj_get_style_outline_color(const struct _lv_obj_t * static inline lv_color_t lv_obj_get_style_outline_color_filtered(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_OUTLINE_COLOR)); + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR)); return v.color; } @@ -380,8 +382,7 @@ static inline lv_color_t lv_obj_get_style_shadow_color(const struct _lv_obj_t * static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_SHADOW_COLOR)); + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR)); return v.color; } @@ -405,8 +406,7 @@ static inline lv_color_t lv_obj_get_style_image_recolor(const struct _lv_obj_t * static inline lv_color_t lv_obj_get_style_image_recolor_filtered(const struct _lv_obj_t * obj, uint32_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, - LV_STYLE_IMAGE_RECOLOR)); + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR)); return v.color; } @@ -566,8 +566,7 @@ static inline lv_opa_t lv_obj_get_style_opa_layered(const struct _lv_obj_t * obj return (lv_opa_t)v.num; } -static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, - uint32_t part) +static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, uint32_t part) { lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); return (const lv_color_filter_dsc_t *)v.ptr; @@ -745,8 +744,9 @@ void lv_obj_set_style_bg_grad_color(struct _lv_obj_t * obj, lv_color_t value, lv void lv_obj_set_style_bg_grad_dir(struct _lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector); void lv_obj_set_style_bg_main_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); void lv_obj_set_style_bg_grad_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_main_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_bg_grad(struct _lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector); -void lv_obj_set_style_bg_dither_mode(struct _lv_obj_t * obj, lv_dither_mode_t value, lv_style_selector_t selector); void lv_obj_set_style_bg_image_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector); void lv_obj_set_style_bg_image_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_bg_image_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); @@ -792,14 +792,12 @@ void lv_obj_set_style_radius(struct _lv_obj_t * obj, lv_coord_t value, lv_style_ void lv_obj_set_style_clip_corner(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_opa_layered(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); -void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, - lv_style_selector_t selector); +void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); void lv_obj_set_style_anim_time(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); -void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, - lv_style_selector_t selector); +void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector); void lv_obj_set_style_blend_mode(struct _lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector); void lv_obj_set_style_layout(struct _lv_obj_t * obj, uint16_t value, lv_style_selector_t selector); void lv_obj_set_style_base_dir(struct _lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector); @@ -808,11 +806,9 @@ void lv_obj_set_style_flex_main_place(struct _lv_obj_t * obj, lv_flex_align_t va void lv_obj_set_style_flex_cross_place(struct _lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); void lv_obj_set_style_flex_track_place(struct _lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); void lv_obj_set_style_flex_grow(struct _lv_obj_t * obj, uint8_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_column_dsc_array(struct _lv_obj_t * obj, const lv_coord_t * value, - lv_style_selector_t selector); +void lv_obj_set_style_grid_column_dsc_array(struct _lv_obj_t * obj, const lv_coord_t * value, lv_style_selector_t selector); void lv_obj_set_style_grid_column_align(struct _lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); -void lv_obj_set_style_grid_row_dsc_array(struct _lv_obj_t * obj, const lv_coord_t * value, - lv_style_selector_t selector); +void lv_obj_set_style_grid_row_dsc_array(struct _lv_obj_t * obj, const lv_coord_t * value, lv_style_selector_t selector); void lv_obj_set_style_grid_row_align(struct _lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); void lv_obj_set_style_grid_cell_column_pos(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); void lv_obj_set_style_grid_cell_x_align(struct _lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 5f6a3e81c70d..b93346c8b8c7 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -2634,14 +2634,13 @@ #define LV_USE_DEMO_BENCHMARK 0 #endif #endif -#if LV_USE_DEMO_BENCHMARK - /*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ - #ifndef LV_DEMO_BENCHMARK_RGB565A8 - #ifdef CONFIG_LV_DEMO_BENCHMARK_RGB565A8 - #define LV_DEMO_BENCHMARK_RGB565A8 CONFIG_LV_DEMO_BENCHMARK_RGB565A8 - #else - #define LV_DEMO_BENCHMARK_RGB565A8 0 - #endif + +/*Render test for each primitives. Requires at least 480x272 display*/ +#ifndef LV_USE_DEMO_RENDER + #ifdef CONFIG_LV_USE_DEMO_RENDER + #define LV_USE_DEMO_RENDER CONFIG_LV_USE_DEMO_RENDER + #else + #define LV_USE_DEMO_RENDER 0 #endif #endif diff --git a/src/misc/lv_style.c b/src/misc/lv_style.c index 37faf24b0148..2b04d51f0036 100644 --- a/src/misc/lv_style.c +++ b/src/misc/lv_style.c @@ -69,8 +69,9 @@ const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PR [LV_STYLE_BG_GRAD_DIR] = 0, [LV_STYLE_BG_MAIN_STOP] = 0, [LV_STYLE_BG_GRAD_STOP] = 0, + [LV_STYLE_BG_MAIN_OPA] = 0, + [LV_STYLE_BG_GRAD_OPA] = 0, [LV_STYLE_BG_GRAD] = 0, - [LV_STYLE_BG_DITHER_MODE] = 0, [LV_STYLE_BG_IMAGE_SRC] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, [LV_STYLE_BG_IMAGE_OPA] = 0, @@ -371,6 +372,8 @@ lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) case LV_STYLE_BORDER_OPA: case LV_STYLE_TEXT_OPA: case LV_STYLE_IMAGE_OPA: + case LV_STYLE_BG_GRAD_OPA: + case LV_STYLE_BG_MAIN_OPA: case LV_STYLE_BG_IMAGE_OPA: case LV_STYLE_OUTLINE_OPA: case LV_STYLE_SHADOW_OPA: diff --git a/src/misc/lv_style.h b/src/misc/lv_style.h index adede6005db8..8b9166ccc07e 100644 --- a/src/misc/lv_style.h +++ b/src/misc/lv_style.h @@ -146,22 +146,6 @@ typedef uint8_t lv_grad_dir_t; #endif /*DOXYGEN*/ -/** - * The dithering algorithm for the gradient - */ -enum _lv_dither_mode_t { - LV_DITHER_NONE, /**< No dithering, colors are just quantized to the output resolution*/ - LV_DITHER_ORDERED, /**< Ordered dithering. Faster to compute and use less memory but lower quality*/ - LV_DITHER_ERR_DIFF, /**< Error diffusion mode. Slower to compute and use more memory but give highest dither quality*/ -}; - -#ifdef DOXYGEN -typedef _lv_dither_mode_t lv_dither_mode_t; -#else -typedef uint8_t lv_dither_mode_t; -#endif /*DOXYGEN*/ - - /** A gradient stop definition. * This matches a color and a position in a virtual 0-255 scale. */ @@ -177,8 +161,6 @@ typedef struct { uint8_t stops_count; /**< The number of used stops in the array */ lv_grad_dir_t dir : 3; /**< The gradient direction. * Any of LV_GRAD_DIR_HOR, LV_GRAD_DIR_VER, LV_GRAD_DIR_NONE */ - lv_dither_mode_t dither : 3; /**< Whether to dither the gradient or not. - * Any of LV_DITHER_NONE, LV_DITHER_ORDERED, LV_DITHER_ERR_DIFF */ } lv_grad_dsc_t; /** @@ -235,13 +217,14 @@ enum _lv_style_prop_t { LV_STYLE_BG_GRAD_DIR = 32, - LV_STYLE_BG_GRAD_COLOR = 33, - LV_STYLE_BG_MAIN_STOP = 34, - LV_STYLE_BG_GRAD_STOP = 35, - - LV_STYLE_BG_GRAD = 36, - LV_STYLE_BG_DITHER_MODE = 37, - LV_STYLE_BASE_DIR = 38, + LV_STYLE_BG_MAIN_STOP = 33, + LV_STYLE_BG_GRAD_STOP = 34, + LV_STYLE_BG_GRAD_COLOR = 35, + + LV_STYLE_BG_MAIN_OPA = 36, + LV_STYLE_BG_GRAD_OPA = 37, + LV_STYLE_BG_GRAD = 38, + LV_STYLE_BASE_DIR = 39, LV_STYLE_BG_IMAGE_SRC = 40, LV_STYLE_BG_IMAGE_OPA = 41, diff --git a/src/misc/lv_style_gen.c b/src/misc/lv_style_gen.c index dfe23c5e7d38..56b5fffb2ce8 100644 --- a/src/misc/lv_style_gen.c +++ b/src/misc/lv_style_gen.c @@ -350,25 +350,35 @@ void lv_style_set_bg_grad_stop(lv_style_t * style, lv_coord_t value) const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_STOP = LV_STYLE_BG_GRAD_STOP; -void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) +void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { - .ptr = value + .num = (int32_t)value }; - lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); + lv_style_set_prop(style, LV_STYLE_BG_MAIN_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD = LV_STYLE_BG_GRAD; +const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_OPA = LV_STYLE_BG_MAIN_OPA; -void lv_style_set_bg_dither_mode(lv_style_t * style, lv_dither_mode_t value) +void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { .num = (int32_t)value }; - lv_style_set_prop(style, LV_STYLE_BG_DITHER_MODE, v); + lv_style_set_prop(style, LV_STYLE_BG_GRAD_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_DITHER_MODE = LV_STYLE_BG_DITHER_MODE; +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_OPA = LV_STYLE_BG_GRAD_OPA; + +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD = LV_STYLE_BG_GRAD; void lv_style_set_bg_image_src(lv_style_t * style, const void * value) { diff --git a/src/misc/lv_style_gen.h b/src/misc/lv_style_gen.h index d8d56917fbd3..4d0221d4b1b4 100644 --- a/src/misc/lv_style_gen.h +++ b/src/misc/lv_style_gen.h @@ -78,10 +78,12 @@ void lv_style_set_bg_main_stop(lv_style_t * style, lv_coord_t value); extern const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_STOP; void lv_style_set_bg_grad_stop(lv_style_t * style, lv_coord_t value); extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_STOP; +void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value); +extern const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_OPA; +void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value); +extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_OPA; void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value); extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD; -void lv_style_set_bg_dither_mode(lv_style_t * style, lv_dither_mode_t value); -extern const lv_style_prop_t _lv_style_const_prop_id_BG_DITHER_MODE; void lv_style_set_bg_image_src(lv_style_t * style, const void * value); extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_SRC; void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value); @@ -391,14 +393,19 @@ extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN; .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ } -#define LV_STYLE_CONST_BG_GRAD(val) \ +#define LV_STYLE_CONST_BG_MAIN_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_GRAD, .value = { .ptr = val } \ + .prop_ptr = &_lv_style_const_prop_id_BG_MAIN_OPA, .value = { .num = (int32_t)val } \ } -#define LV_STYLE_CONST_BG_DITHER_MODE(val) \ +#define LV_STYLE_CONST_BG_GRAD_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_DITHER_MODE, .value = { .num = (int32_t)val } \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD, .value = { .ptr = val } \ } #define LV_STYLE_CONST_BG_IMAGE_SRC(val) \ diff --git a/tests/src/lv_test_conf_full.h b/tests/src/lv_test_conf_full.h index f415316a0a40..4ec0aa72c788 100644 --- a/tests/src/lv_test_conf_full.h +++ b/tests/src/lv_test_conf_full.h @@ -83,6 +83,7 @@ #define LV_USE_DEMO_STRESS 1 #define LV_USE_DEMO_TRANSFORM 1 #define LV_USE_DEMO_MULTILANG 1 +#define LV_USE_DEMO_RENDER 1 #define LV_USE_DEMO_SCROLL 1 #define LV_USE_OBJ_ID 1