From 8d04466c68c6309b6ba15c759922b56f998e2ab4 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Thu, 13 Feb 2025 01:03:27 +0100 Subject: [PATCH] feat(test): make LVGL's test utilities public --- Kconfig | 5 + docs/details/other-components/test.rst | 156 ++++++++++++++ lv_conf_template.h | 9 + lvgl.h | 1 + src/core/lv_global.h | 5 + src/lv_conf_internal.h | 21 ++ src/others/test/lv_test.h | 45 ++++ src/others/test/lv_test_display.c | 108 ++++++++++ src/others/test/lv_test_display.h | 55 +++++ src/others/test/lv_test_helpers.c | 60 ++++++ src/others/test/lv_test_helpers.h | 80 ++++++++ src/others/test/lv_test_indev.c | 194 ++++++++++++++++++ src/others/test/lv_test_indev.h | 166 +++++++++++++++ src/others/test/lv_test_private.h | 61 ++++++ .../others/test/lv_test_screenshot_compare.c | 160 ++++++--------- src/others/test/lv_test_screenshot_compare.h | 53 +++++ tests/CMakeLists.txt | 6 +- .../i1/demo_render_arc_image_opa_192.png | Bin 2554 -> 2526 bytes .../i1/demo_render_arc_image_opa_255.png | Bin 3429 -> 3422 bytes .../i1/demo_render_arc_normal_opa_192.png | Bin 2252 -> 2247 bytes .../i1/demo_render_arc_normal_opa_255.png | Bin 2252 -> 2247 bytes .../i1/demo_render_blend_mode_opa_192.png | Bin 4781 -> 4704 bytes .../i1/demo_render_blend_mode_opa_255.png | Bin 5902 -> 5848 bytes .../render/i1/demo_render_border_opa_192.png | Bin 3244 -> 3243 bytes .../render/i1/demo_render_border_opa_255.png | Bin 3244 -> 3243 bytes .../i1/demo_render_box_shadow_opa_192.png | Bin 3967 -> 3914 bytes .../i1/demo_render_box_shadow_opa_255.png | Bin 3862 -> 3834 bytes .../demo_render_conical_gradient_opa_192.png | Bin 4284 -> 4257 bytes .../demo_render_conical_gradient_opa_255.png | Bin 4919 -> 4901 bytes .../render/i1/demo_render_fill_opa_192.png | Bin 3540 -> 3508 bytes .../render/i1/demo_render_fill_opa_255.png | Bin 3633 -> 3606 bytes .../i1/demo_render_image_normal_1_opa_192.png | Bin 6658 -> 6540 bytes .../i1/demo_render_image_normal_1_opa_255.png | Bin 8174 -> 8064 bytes .../i1/demo_render_image_normal_2_opa_192.png | Bin 6168 -> 6122 bytes .../i1/demo_render_image_normal_2_opa_255.png | Bin 6136 -> 6089 bytes .../demo_render_image_recolor_1_opa_192.png | Bin 3137 -> 3094 bytes .../demo_render_image_recolor_1_opa_255.png | Bin 7198 -> 7087 bytes .../demo_render_image_recolor_2_opa_192.png | Bin 5270 -> 5243 bytes .../demo_render_image_recolor_2_opa_255.png | Bin 5937 -> 5891 bytes .../i1/demo_render_layer_normal_opa_192.png | Bin 8629 -> 8561 bytes .../i1/demo_render_layer_normal_opa_255.png | Bin 8044 -> 8008 bytes .../render/i1/demo_render_line_opa_192.png | Bin 2252 -> 2247 bytes .../render/i1/demo_render_line_opa_255.png | Bin 2252 -> 2247 bytes .../demo_render_linear_gradient_opa_192.png | Bin 4194 -> 4173 bytes .../demo_render_linear_gradient_opa_255.png | Bin 4578 -> 4568 bytes .../demo_render_radial_gradient_opa_192.png | Bin 4903 -> 4851 bytes .../demo_render_radial_gradient_opa_255.png | Bin 5508 -> 5449 bytes .../render/i1/demo_render_text_opa_192.png | Bin 5783 -> 5754 bytes .../render/i1/demo_render_text_opa_255.png | Bin 5783 -> 5754 bytes .../i1/demo_render_triangle_opa_192.png | Bin 2936 -> 2940 bytes .../i1/demo_render_triangle_opa_255.png | Bin 3334 -> 3335 bytes tests/ref_imgs/widgets/label_scroll_13.png | Bin 4508 -> 4516 bytes tests/ref_imgs/widgets/label_scroll_14.png | Bin 4885 -> 4804 bytes tests/ref_imgs/widgets/label_scroll_15.png | Bin 0 -> 4418 bytes tests/ref_imgs/widgets/label_scroll_16.png | Bin 0 -> 4802 bytes tests/ref_imgs/widgets/label_scroll_17.png | Bin 0 -> 4509 bytes tests/ref_imgs/widgets/label_scroll_18.png | Bin 0 -> 4769 bytes tests/ref_imgs/widgets/label_scroll_19.png | Bin 0 -> 4783 bytes .../widgets/obj_flag_overflow_visible_1_1.png | Bin 6062 -> 6056 bytes .../widgets/obj_flag_overflow_visible_1_2.png | Bin 6210 -> 6204 bytes .../widgets/obj_flag_overflow_visible_1_3.png | Bin 6570 -> 6570 bytes .../widgets/label_scroll_13.png | Bin 4544 -> 4540 bytes .../widgets/label_scroll_14.png | Bin 4915 -> 4838 bytes .../widgets/label_scroll_15.png | Bin 0 -> 4413 bytes .../widgets/label_scroll_16.png | Bin 0 -> 4787 bytes .../widgets/label_scroll_17.png | Bin 0 -> 4532 bytes .../widgets/label_scroll_18.png | Bin 0 -> 4797 bytes .../widgets/label_scroll_19.png | Bin 0 -> 4788 bytes .../widgets/obj_flag_overflow_visible_1_1.png | Bin 6659 -> 6652 bytes .../widgets/obj_flag_overflow_visible_1_2.png | Bin 6785 -> 6810 bytes .../widgets/obj_flag_overflow_visible_1_3.png | Bin 7279 -> 7266 bytes tests/src/lv_test_conf_full.h | 2 + tests/src/lv_test_conf_minimal.h | 2 + tests/src/lv_test_helpers.c | 12 -- tests/src/lv_test_helpers.h | 27 --- tests/src/lv_test_indev.c | 135 ------------ tests/src/lv_test_indev.h | 52 ----- tests/src/lv_test_init.c | 53 +---- tests/src/test_cases/cache/test_cache.c | 2 +- tests/src/test_cases/draw/test_draw_blend.c | 6 +- tests/src/test_cases/draw/test_draw_svg.c | 2 +- tests/src/test_cases/draw/test_draw_vector.c | 2 +- tests/src/test_cases/libs/test_bmp.c | 2 +- .../src/test_cases/libs/test_libjpeg_turbo.c | 2 +- tests/src/test_cases/libs/test_libpng.c | 2 +- tests/src/test_cases/libs/test_lodepng.c | 2 +- tests/src/test_cases/libs/test_memmove.c | 2 +- tests/src/test_cases/libs/test_tjpgd.c | 2 +- tests/src/test_cases/test_anim.c | 3 +- tests/src/test_cases/test_anim_timeline.c | 2 +- tests/src/test_cases/test_bindings.c | 4 +- tests/src/test_cases/test_click.c | 7 +- tests/src/test_cases/test_demo_stress.c | 3 - tests/src/test_cases/test_demo_widgets.c | 3 - tests/src/test_cases/test_draw_buf_stride.c | 2 +- tests/src/test_cases/test_event.c | 1 - tests/src/test_cases/test_gridnav.c | 3 +- tests/src/test_cases/test_hover.c | 7 +- tests/src/test_cases/test_indev_reset.c | 7 +- .../src/test_cases/test_indev_wait_release.c | 11 +- tests/src/test_cases/test_observer.c | 11 +- tests/src/test_cases/widgets/test_animimg.c | 1 - tests/src/test_cases/widgets/test_arc.c | 27 ++- tests/src/test_cases/widgets/test_bar.c | 14 +- tests/src/test_cases/widgets/test_btnmatrix.c | 3 +- tests/src/test_cases/widgets/test_checkbox.c | 3 - tests/src/test_cases/widgets/test_dropdown.c | 14 +- tests/src/test_cases/widgets/test_label.c | 13 +- tests/src/test_cases/widgets/test_lottie.c | 34 +-- tests/src/test_cases/widgets/test_msgbox.c | 1 - tests/src/test_cases/widgets/test_obj_flags.c | 1 - tests/src/test_cases/widgets/test_roller.c | 9 +- tests/src/test_cases/widgets/test_slider.c | 5 +- tests/src/test_cases/widgets/test_spinbox.c | 3 +- tests/src/test_cases/widgets/test_switch.c | 7 +- tests/src/test_cases/widgets/test_tabview.c | 1 - tests/src/test_cases/xml/test_xml_event.c | 5 +- tests/unity/unity_support.h | 8 +- 118 files changed, 1189 insertions(+), 516 deletions(-) create mode 100644 docs/details/other-components/test.rst create mode 100644 src/others/test/lv_test.h create mode 100644 src/others/test/lv_test_display.c create mode 100644 src/others/test/lv_test_display.h create mode 100644 src/others/test/lv_test_helpers.c create mode 100644 src/others/test/lv_test_helpers.h create mode 100644 src/others/test/lv_test_indev.c create mode 100644 src/others/test/lv_test_indev.h create mode 100644 src/others/test/lv_test_private.h rename tests/unity/unity_support.c => src/others/test/lv_test_screenshot_compare.c (71%) create mode 100644 src/others/test/lv_test_screenshot_compare.h create mode 100644 tests/ref_imgs/widgets/label_scroll_15.png create mode 100644 tests/ref_imgs/widgets/label_scroll_16.png create mode 100644 tests/ref_imgs/widgets/label_scroll_17.png create mode 100644 tests/ref_imgs/widgets/label_scroll_18.png create mode 100644 tests/ref_imgs/widgets/label_scroll_19.png create mode 100644 tests/ref_imgs_vg_lite/widgets/label_scroll_15.png create mode 100644 tests/ref_imgs_vg_lite/widgets/label_scroll_16.png create mode 100644 tests/ref_imgs_vg_lite/widgets/label_scroll_17.png create mode 100644 tests/ref_imgs_vg_lite/widgets/label_scroll_18.png create mode 100644 tests/ref_imgs_vg_lite/widgets/label_scroll_19.png delete mode 100644 tests/src/lv_test_helpers.c delete mode 100644 tests/src/lv_test_helpers.h delete mode 100644 tests/src/lv_test_indev.c delete mode 100644 tests/src/lv_test_indev.h diff --git a/Kconfig b/Kconfig index 51eabf11c..4220be262 100644 --- a/Kconfig +++ b/Kconfig @@ -1642,6 +1642,11 @@ menu "LVGL configuration" int "Font manager name max length" depends on LV_USE_FONT_MANAGER default 32 + config LV_USE_TEST + bool "Enable emulated input devices, time emulation, and screenshot compares." + config LV_USE_TEST_SCREENSHOT_COMPARE + bool "Enable `lv_test_screenshot_compare`. Requires libpng and a few MB of extra RAM." + depends on LV_USE_TEST config LV_USE_XML bool "Enable loading XML UIs runtime" config LVGL_VERSION_MAJOR diff --git a/docs/details/other-components/test.rst b/docs/details/other-components/test.rst new file mode 100644 index 000000000..403f2c427 --- /dev/null +++ b/docs/details/other-components/test.rst @@ -0,0 +1,156 @@ +.. _test: + +==== +Test +==== + +Overview +******** + +The Test module provides functions to emulate clicks, key presses, encoder turns, time passing, and +compare the UI with reference images. + +These functions can be easily used in any test framework (such as Unity, GoogleTest, etc.), and +assertions can be performed to check if, for example: + +- A widget's value is different from the expected value after emulating user inputs. +- The values are incorrect after some time has passed. +- The screen's content is different from the reference image. +- Some event functions are not triggered. +- Etc. + +Note that it is assumed the tests are performed on a desktop or server environment, +where there are no memory constraints. + +Usage +***** + +The Test module can be enabled by ``LV_USE_TEST``, and it consists of the following components: + +- Helpers +- Display emulation +- Input device emulation +- Screenshot comparison + +Helpers +------- + +Time +^^^^ + +To emulate elapsed time, two functions can be used: + +1. :cpp:expr:`lv_test_wait(ms)`: Emulates that ``ms`` milliseconds have elapsed, but it also calls ``lv_timer_handler`` after each millisecond. + This is useful to check if events (e.g., long press, long press repeat) and timers were triggered correctly over time. +2. :cpp:expr:`lv_test_fast_forward(ms)`: Jumps ``ms`` milliseconds ahead and calls ``lv_timer_handler`` only once at the end. + +:cpp:expr:`lv_refr_now(NULL)` is called at the end of both functions to ensure that animations and +widget coordinates are recalculated. + +:cpp:expr:`lv_refr_now(NULL)` can also be called manually to force LVGL to refresh the emulated display. + +Memory Usage +^^^^^^^^^^^^ + +If ``LV_USE_STDLIB_MALLOC`` is set to ``LV_STDLIB_BUILTIN``, memory usage and memory leaks can be monitored. + +.. code-block:: c + + size_t mem1 = lv_test_get_free_mem(); + + size_t mem2 = lv_test_get_free_mem(); + if(mem1 != mem2) fail(); + +It might make sense to create and delete items in a loop many times and add a small tolerance +to the memory leakage test. This might be needed due to potential memory fragmentation. Empirically, +a tolerance of 32 bytes is recommended. + +.. code-block:: c + + if(LV_ABS((int64_t)mem2 - (int64_t)mem1) > 32) fail(); + +Display Emulation +----------------- + +By calling :cpp:expr:`lv_test_display_create(hor_res, ver_res)`, a dummy display can be created. + +It functions like any other normal display, but its content exists only in memory. + +When creating this display, the horizontal and vertical resolutions must be passed. Internally, +a framebuffer will be allocated for this size, and ``XRGB8888`` color format will be set. + +The resolution and color format can be changed at any time by calling :cpp:expr:`lv_display_set_resolution` and +:cpp:expr:`lv_display_set_color_format`. + +Input Device Emulation +---------------------- + +By calling :cpp:expr:`lv_test_indev_create_all`, three test input devices will be created: + +1. A pointer (for touch or mouse) +2. A keypad +3. An encoder + +For example, this is how a scroll gesture can be emulated: + +.. code-block:: c + + lv_test_mouse_move_to(20, 30); + lv_test_mouse_press(); + lv_test_wait(20); + lv_test_mouse_move_by(0, 100); + lv_test_wait(20); + lv_test_mouse_release(); + lv_test_wait(20); + +It is recommended to add :cpp:expr:`lv_test_wait` after user actions to ensure that +the new state and coordinates are read and applied from the input device. + +After that, the user can check if the given widget was really scrolled +by getting the Y coordinate of a child. + +.. code-block:: c + + int32_t y_start = lv_obj_get_y(child); + + int32_t y_end = lv_obj_get_y(child); + if(y_start + 100 != y_end) fail(); + +Please refer to ``lv_test_indev.h`` for the list of supported input device emulation functions. + +Screenshot Comparison +--------------------- + +:cpp:expr:`bool lv_test_screenshot_compare(const char * fn_ref)` is a useful function +to compare the content of the emulated display with reference PNG images. + +The screenshot comparison uses `libpng`, so it needs to be linked to LVGL when this feature is required. +To avoid making the entire Test module dependent on `libpng`, screenshot comparison can be individually enabled by +``LV_USE_TEST_SCREENSHOT_COMPARE``. + +This function works in a practical way: + +- If the folder(s) referenced in ``fn_ref`` do not exist, they will be created automatically. +- If the reference image is not found, it will be created automatically from the rendered screen. +- If the comparison fails, an ``_err.png`` file will be created with the rendered content next to the reference image. +- If the comparison fails, the X and Y coordinates of the first divergent pixel, along with the actual and expected colors, will also be printed. + +The reference PNG images should have a **32-bit color format** and match the display size. + +The test display's content will be converted to ``XRGB8888`` to simplify comparison with the reference images. +The conversion is supported from the following formats (i.e., the test display should have a color +format from any of these): + +- :cpp:expr:`LV_COLOR_FORMAT_XRGB8888` +- :cpp:expr:`LV_COLOR_FORMAT_ARGB8888` +- :cpp:expr:`LV_COLOR_FORMAT_RGB888` +- :cpp:expr:`LV_COLOR_FORMAT_RGB565` +- :cpp:expr:`LV_COLOR_FORMAT_L8` +- :cpp:expr:`LV_COLOR_FORMAT_AL88` +- :cpp:expr:`LV_COLOR_FORMAT_I1` + +To read and decode PNG images and to store the converted rendered image, a few MBs of RAM are dynamically allocated using the standard ``malloc`` +(not :cpp:expr:`lv_malloc`). + +API +*** diff --git a/lv_conf_template.h b/lv_conf_template.h index 43abdf3b2..c5880b719 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -1121,6 +1121,15 @@ #endif +/** Enable emulated input devices, time emulation, and screenshot compares. */ +#define LV_USE_TEST 0 +#if LV_USE_TEST + +/** Enable `lv_test_screenshot_compare`. + * Requires libpng and a few MB of extra RAM. */ +#define LV_USE_TEST_SCREENSHOT_COMPARE 0 +#endif /*LV_USE_TEST*/ + /** Enable loading XML UIs runtime */ #define LV_USE_XML 0 diff --git a/lvgl.h b/lvgl.h index 73051e1ad..6ee7e7379 100644 --- a/lvgl.h +++ b/lvgl.h @@ -96,6 +96,7 @@ extern "C" { #include "src/others/font_manager/lv_font_manager.h" #include "src/others/xml/lv_xml.h" #include "src/others/xml/lv_xml_component.h" +#include "src/others/test/lv_test.h" #include "src/libs/barcode/lv_barcode.h" #include "src/libs/bin_decoder/lv_bin_decoder.h" diff --git a/src/core/lv_global.h b/src/core/lv_global.h index a9356ba29..4515c01c9 100644 --- a/src/core/lv_global.h +++ b/src/core/lv_global.h @@ -53,6 +53,7 @@ extern "C" { #include "../draw/sw/lv_draw_sw_mask_private.h" #include "../stdlib/builtin/lv_tlsf_private.h" #include "../others/sysmon/lv_sysmon_private.h" +#include "../others/test/lv_test_private.h" #include "../layouts/lv_layout_private.h" /********************* @@ -223,6 +224,10 @@ typedef struct _lv_global_t { uint32_t objid_count; #endif +#if LV_USE_TEST + lv_test_state_t test_state; +#endif + #if LV_USE_NUTTX struct _lv_nuttx_ctx_t * nuttx_ctx; #endif diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 481052242..d70a33f20 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -3550,6 +3550,27 @@ #endif +/** Enable emulated input devices, time emulation, and screenshot compares. */ +#ifndef LV_USE_TEST + #ifdef CONFIG_LV_USE_TEST + #define LV_USE_TEST CONFIG_LV_USE_TEST + #else + #define LV_USE_TEST 0 + #endif +#endif +#if LV_USE_TEST + +/** Enable `lv_test_screenshot_compare`. + * Requires libpng and a few MB of extra RAM. */ +#ifndef LV_USE_TEST_SCREENSHOT_COMPARE + #ifdef CONFIG_LV_USE_TEST_SCREENSHOT_COMPARE + #define LV_USE_TEST_SCREENSHOT_COMPARE CONFIG_LV_USE_TEST_SCREENSHOT_COMPARE + #else + #define LV_USE_TEST_SCREENSHOT_COMPARE 0 + #endif +#endif +#endif /*LV_USE_TEST*/ + /** Enable loading XML UIs runtime */ #ifndef LV_USE_XML #ifdef CONFIG_LV_USE_XML diff --git a/src/others/test/lv_test.h b/src/others/test/lv_test.h new file mode 100644 index 000000000..b22c1636e --- /dev/null +++ b/src/others/test/lv_test.h @@ -0,0 +1,45 @@ +/** + * @file lv_test.h + * + */ + +#ifndef LV_TEST_H +#define LV_TEST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +/********************* + * DEFINES + *********************/ +#include "lv_test_indev.h" +#include "lv_test_display.h" +#include "lv_test_helpers.h" +#include "lv_test_screenshot_compare.h" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_H*/ diff --git a/src/others/test/lv_test_display.c b/src/others/test/lv_test_display.c new file mode 100644 index 000000000..f3aa892f6 --- /dev/null +++ b/src/others/test/lv_test_display.c @@ -0,0 +1,108 @@ +/** + * @file lv_test_display.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_test_display.h" +#if LV_USE_TEST + +#include "../../core/lv_global.h" +#include "../../lvgl_private.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void dummy_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); + +static void buf_changed_event_cb(lv_event_t * e); +static void delete_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define _state LV_GLOBAL_DEFAULT()->test_state + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_test_display_create(int32_t hor_res, int32_t ver_res) +{ + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + lv_display_set_color_format(disp, LV_COLOR_FORMAT_XRGB8888); + + size_t buf_size = 4 * (hor_res + LV_DRAW_BUF_STRIDE_ALIGN - 1) * ver_res + LV_DRAW_BUF_ALIGN; + uint8_t * buf = malloc(buf_size); + LV_ASSERT_MALLOC(buf); + + lv_draw_buf_init(&_state.draw_buf, hor_res, ver_res, LV_COLOR_FORMAT_XRGB8888, LV_STRIDE_AUTO, lv_draw_buf_align(buf, + LV_COLOR_FORMAT_XRGB8888), buf_size); + _state.draw_buf.unaligned_data = buf; + lv_display_set_draw_buffers(disp, &_state.draw_buf, NULL); + lv_display_set_render_mode(disp, LV_DISPLAY_RENDER_MODE_DIRECT); + + lv_display_set_flush_cb(disp, dummy_flush_cb); + + lv_display_add_event_cb(disp, buf_changed_event_cb, LV_EVENT_COLOR_FORMAT_CHANGED, NULL); + lv_display_add_event_cb(disp, buf_changed_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_add_event_cb(disp, delete_event_cb, LV_EVENT_DELETE, NULL); + + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void buf_changed_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + lv_color_format_t cf = 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); + + free(_state.draw_buf.unaligned_data); + + size_t buf_size = 4 * (hor_res + LV_DRAW_BUF_STRIDE_ALIGN - 1) * ver_res + LV_DRAW_BUF_ALIGN; + uint8_t * buf = malloc(buf_size); + LV_ASSERT_MALLOC(buf); + + lv_draw_buf_init(&_state.draw_buf, hor_res, ver_res, cf, LV_STRIDE_AUTO, lv_draw_buf_align(buf, cf), buf_size); + _state.draw_buf.unaligned_data = buf; + lv_display_set_draw_buffers(disp, &_state.draw_buf, NULL); +} + +static void delete_event_cb(lv_event_t * e) +{ + LV_UNUSED(e); + lv_display_t * disp = lv_event_get_target(e); + lv_draw_buf_t * draw_buf = lv_display_get_buf_active(disp); + free(draw_buf->unaligned_data); + +} + +static void dummy_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + LV_UNUSED(area); + LV_UNUSED(color_p); + lv_display_flush_ready(disp); +} + +#endif /*LV_USE_TEST*/ diff --git a/src/others/test/lv_test_display.h b/src/others/test/lv_test_display.h new file mode 100644 index 000000000..ea39da2da --- /dev/null +++ b/src/others/test/lv_test_display.h @@ -0,0 +1,55 @@ +/** + * @file lv_test_display.h + * + */ + +#ifndef LV_TEST_DISPLAY_H +#define LV_TEST_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*** + * Create a dummy display for for the tests + * @param hor_res the maximal horizontal resolution + * @param ver_res the maximal vertical resolution + * @return the created display + * + * @note The resolution can be changed to any smaller values later + * using `lv_display_set_resolution` + * The color format can be freely changed later using `lv_display_set_color_format` + */ +lv_display_t * lv_test_display_create(int32_t hor_res, int32_t ver_res); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_DISPLAY_H*/ diff --git a/src/others/test/lv_test_helpers.c b/src/others/test/lv_test_helpers.c new file mode 100644 index 000000000..cbaadca7d --- /dev/null +++ b/src/others/test/lv_test_helpers.c @@ -0,0 +1,60 @@ +/** + * @file lv_test_helpers.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_test_helpers.h" + +#if LV_USE_TEST +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_test_wait(uint32_t ms) +{ + while(ms) { + lv_tick_inc(1); + lv_timer_handler(); + ms--; + } + lv_refr_now(NULL); +} + +void lv_test_fast_forward(uint32_t ms) +{ + lv_tick_inc(ms); + lv_timer_handler(); + lv_refr_now(NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_TEST*/ diff --git a/src/others/test/lv_test_helpers.h b/src/others/test/lv_test_helpers.h new file mode 100644 index 000000000..0c9048b8d --- /dev/null +++ b/src/others/test/lv_test_helpers.h @@ -0,0 +1,80 @@ +/** + * @file lv_test_helpers.h + * + */ + +#ifndef LV_TEST_HELPERS_H +#define LV_TEST_HELPERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" +#include "../../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Emulate a delay. It's not real delay, but it tricks LVGL to think that the + * required time has been elapsed. + * `lv_timer_handler` is called after each millisecond, meaning all the events + * will be fired inside this function. + * At the end the animations and display will be also updated. + * @param ms the number of milliseconds to pass + */ +void lv_test_wait(uint32_t ms); + +/** + * Emulates some time passing. + * Update the animations and the display only once at the end. + * @param ms the number of milliseconds to pass + */ +void lv_test_fast_forward(uint32_t ms); + +#if LV_USE_STDLIB_MALLOC != LV_STDLIB_BUILTIN +/* Skip checking heap as we don't have the info available */ +#define LV_HEAP_CHECK(x) do {} while(0) +/* Pick a non-zero value */ +#define lv_test_get_free_mem() (65536) +#else +#define LV_HEAP_CHECK(x) x + +static inline size_t lv_test_get_free_mem(void) +{ + lv_mem_monitor_t m1; + lv_mem_monitor(&m1); + return m1.free_size; +} +#endif /* LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN */ + +/********************** + * MACROS + **********************/ + +#define LV_TEST_WIDTH_TO_STRIDE(w, px_size) ((((w) * (px_size) + (LV_DRAW_BUF_STRIDE_ALIGN - 1)) / LV_DRAW_BUF_STRIDE_ALIGN) * LV_DRAW_BUF_STRIDE_ALIGN) + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_HELPERS_H*/ diff --git a/src/others/test/lv_test_indev.c b/src/others/test/lv_test_indev.c new file mode 100644 index 000000000..11bdb14b2 --- /dev/null +++ b/src/others/test/lv_test_indev.c @@ -0,0 +1,194 @@ +/** + * @file lv_test_indev.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_test.h" +#if LV_USE_TEST + +#include "../../core/lv_global.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_test_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void lv_test_keypad_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void lv_test_encoder_read_cb(lv_indev_t * indev, lv_indev_data_t * data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define _state LV_GLOBAL_DEFAULT()->test_state + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_test_indev_create_all(void) +{ + _state.mouse_indev = lv_indev_create(); + lv_indev_set_type(_state.mouse_indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(_state.mouse_indev, lv_test_mouse_read_cb); + + _state.keypad_indev = lv_indev_create(); + lv_indev_set_type(_state.keypad_indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(_state.keypad_indev, lv_test_keypad_read_cb); + + _state.encoder_indev = lv_indev_create(); + lv_indev_set_type(_state.encoder_indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(_state.encoder_indev, lv_test_encoder_read_cb); +} + +lv_indev_t * lv_test_indev_get_indev(lv_indev_type_t type) +{ + switch(type) { + case LV_INDEV_TYPE_POINTER: + return _state.mouse_indev; + case LV_INDEV_TYPE_KEYPAD: + return _state.keypad_indev; + case LV_INDEV_TYPE_ENCODER: + return _state.encoder_indev; + default: + return NULL; + + } +} + +void lv_test_mouse_move_to(int32_t x, int32_t y) +{ + _state.x_act = x; + _state.y_act = y; +} + + +void lv_test_mouse_move_to_obj(lv_obj_t * obj) +{ + int32_t x = obj->coords.x1 + lv_obj_get_width(obj) / 2; + int32_t y = obj->coords.y1 + lv_obj_get_height(obj) / 2; + lv_test_mouse_move_to(x, y); +} + +void lv_test_mouse_move_by(int32_t x, int32_t y) +{ + _state.x_act += x; + _state.y_act += y; +} + +void lv_test_mouse_press(void) +{ + _state.mouse_pressed = true; +} + +void lv_test_mouse_release(void) +{ + _state.mouse_pressed = false; +} + +void lv_test_mouse_click_at(int32_t x, int32_t y) +{ + lv_test_mouse_release(); + lv_test_wait(50); + lv_test_mouse_move_to(x, y); + lv_test_mouse_press(); + lv_test_wait(50); + lv_test_mouse_release(); + lv_test_wait(50); +} + +void lv_test_key_press(uint32_t k) +{ + _state.key_act = k; + _state.key_pressed = true; +} + +void lv_test_key_release(void) +{ + _state.key_pressed = false; +} + +void lv_test_key_hit(uint32_t k) +{ + lv_test_key_release(); + lv_test_wait(50); + lv_test_key_press(k); + lv_test_wait(50); + lv_test_key_release(); + lv_test_wait(50); +} + +void lv_test_encoder_add_diff(int32_t d) +{ + _state.diff_act += d; +} + +void lv_test_encoder_turn(int32_t d) +{ + _state.diff_act += d; + lv_test_wait(50); +} + +void lv_test_encoder_press(void) +{ + _state.enc_pressed = true; +} + +void lv_test_encoder_release(void) +{ + _state.enc_pressed = false; +} + +void lv_test_encoder_click(void) +{ + lv_test_encoder_release(); + lv_test_wait(50); + lv_test_encoder_press(); + lv_test_wait(50); + lv_test_encoder_release(); + lv_test_wait(50); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_test_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + lv_point_set(&data->point, _state.x_act, _state.y_act); + data->state = _state.mouse_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +} + + +static void lv_test_keypad_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + data->key = _state.key_act; + data->state = _state.key_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +} + + +static void lv_test_encoder_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + data->enc_diff = _state.diff_act; + data->state = _state.enc_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + _state.diff_act = 0; +} + +#endif /*LV_USE_TEST*/ diff --git a/src/others/test/lv_test_indev.h b/src/others/test/lv_test_indev.h new file mode 100644 index 000000000..7d833fff4 --- /dev/null +++ b/src/others/test/lv_test_indev.h @@ -0,0 +1,166 @@ +/** + * @file lv_test_indev.h + * + */ + +#ifndef LV_TEST_INDEV_H +#define LV_TEST_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" +#include "../../indev/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a mouse (pointer), keypad, and encoder indevs. + * They can be controlled via function calls during the test + */ +void lv_test_indev_create_all(void); + +/** + * Get one of the indev created in `lv_test_indev_create_all` + * @param type type of the indev to get + * @return the indev + */ +lv_indev_t * lv_test_indev_get_indev(lv_indev_type_t type); + +/** + * Move the mouse to the given coordinates. + * This function doesn't wait, but just changes the state and returns immediately. + * @param x the target absolute X coordinate + * @param y the target absolute Y coordinate + */ +void lv_test_mouse_move_to(int32_t x, int32_t y); + +/** + * Move the mouse to the center of a widget + * This function doesn't wait, but just changes the state and returns immediately. + * @param obj pointer to an widget + */ +void lv_test_mouse_move_to_obj(lv_obj_t * obj); + +/** + * Move the mouse cursor. Keep the pressed or released state + * This function doesn't wait, but just changes the state and returns immediately. + * @param x the difference in X to move + * @param y the difference in Y to move + */ +void lv_test_mouse_move_by(int32_t x, int32_t y); + +/** + * Make the mouse button pressed. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_mouse_press(void); + +/** + * Make the mouse button released. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_mouse_release(void); + +/** + * Emulate a click on a given point. + * First set the released state, wait a little, press, wait, and release again. + * The wait time is 50ms. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + * @param x the target absolute X coordinate + * @param y the target absolute Y coordinate + */ +void lv_test_mouse_click_at(int32_t x, int32_t y); + +/** + * Emulate a key press. + * This function doesn't wait, but just changes the state and returns immediately. + * @param k the key to press + */ +void lv_test_key_press(uint32_t k); + +/** + * Release the previously press key. + * This function doesn't wait, but just changes the state and returns immediately. + * @param k the key to press + */ +void lv_test_key_release(void); + +/** + * Emulate a key hit. + * First set the released state, wait a little, press, wait, and release again. + * The wait time is 50ms. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + * @param k the key to hit + */ +void lv_test_key_hit(uint32_t k); + + +/** + * Emulate encoder rotation, use positive parameter to rotate to the right + * and negative to rotate to the left. + * This function doesn't wait, but just changes the state and returns immediately. + * @param d number of encoder ticks to emulate + */ +void lv_test_encoder_add_diff(int32_t d); + +/** + * Emulate an encoder turn a wait 50ms. Use positive parameter to rotate to the right + * and negative to rotate to the left. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + * @param d number of encoder ticks to emulate + */ +void lv_test_encoder_turn(int32_t d); + +/** + * Emulate an encoder press. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_encoder_press(void); + +/** + * Emulate an encoder release. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_encoder_release(void); + +/** + * Emulate am encoder click. + * First set the released state, wait a little, press, wait, and release again. + * The wait time is 50ms. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + */ +void lv_test_encoder_click(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_INDEV_H*/ + + + + diff --git a/src/others/test/lv_test_private.h b/src/others/test/lv_test_private.h new file mode 100644 index 000000000..eebca7109 --- /dev/null +++ b/src/others/test/lv_test_private.h @@ -0,0 +1,61 @@ +/** + * @file lv_test_private.h + * + */ + +#ifndef LV_TEST_PRIVATE_H +#define LV_TEST_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_indev_t * mouse_indev; + lv_indev_t * keypad_indev; + lv_indev_t * encoder_indev; + + + lv_draw_buf_t draw_buf; + + int32_t x_act; + int32_t y_act; + uint32_t key_act; + int32_t diff_act; + bool mouse_pressed; + bool key_pressed; + bool enc_pressed; +} lv_test_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + + +#endif /*LV_TEST_PRIVATE_H*/ diff --git a/tests/unity/unity_support.c b/src/others/test/lv_test_screenshot_compare.c similarity index 71% rename from tests/unity/unity_support.c rename to src/others/test/lv_test_screenshot_compare.c index c5da40a48..555292e78 100644 --- a/tests/unity/unity_support.c +++ b/src/others/test/lv_test_screenshot_compare.c @@ -11,14 +11,15 @@ /********************* * INCLUDES *********************/ -#if LV_BUILD_TEST -#include "../lvgl.h" +#include "../../lv_conf_internal.h" +#if LV_USE_TEST && defined(LV_USE_TEST_SCREENSHOT_COMPARE) && LV_USE_TEST_SCREENSHOT_COMPARE + +#include "../../lvgl.h" #include #include #include #include #include -#include "unity.h" #define PNG_DEBUG 3 #include @@ -35,7 +36,7 @@ *********************/ #ifndef REF_IMGS_PATH - #define REF_IMGS_PATH "ref_imgs/" + #define REF_IMGS_PATH "" #endif #ifndef REF_IMG_TOLERANCE @@ -48,6 +49,7 @@ /********************** * TYPEDEFS **********************/ + typedef struct { int width, height; png_byte color_type; @@ -62,7 +64,7 @@ typedef struct { /********************** * STATIC PROTOTYPES **********************/ -static bool screenshot_compare(const char * fn_ref, const char * mode, uint8_t tolerance); +static bool screenshot_compare(const char * fn_ref, uint8_t tolerance); static int read_png_file(png_image_t * p, const char * file_name); static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name); static void png_release(png_image_t * p); @@ -81,52 +83,16 @@ static void create_folders_if_needed(const char * path) ; * GLOBAL FUNCTIONS **********************/ -bool lv_test_assert_image_eq(const char * fn_ref) +bool lv_test_screenshot_compare(const char * fn_ref) { bool pass; lv_obj_t * scr = lv_screen_active(); lv_obj_invalidate(scr); - pass = screenshot_compare(fn_ref, "full refresh", REF_IMG_TOLERANCE); + pass = screenshot_compare(fn_ref, REF_IMG_TOLERANCE); if(!pass) return false; - //Software has minor rounding errors when not the whole image is updated - //so ignore stripe invalidation for now - // uint32_t i; - // for(i = 0; i < 800; i += 50 ) { - // lv_area_t a; - // a.y1 = 0; - // a.y2 = 479; - // a.x1 = i; - // a.x2 = i + 12; - // lv_obj_invalidate_area(scr, &a); - // - // a.x1 = i + 25; - // a.x2 = i + 32; - // lv_obj_invalidate_area(scr, &a); - // } - // - // pass = screenshot_compare(fn_ref, "vertical stripes", 32); - // if(!pass) return false; - // - // - // for(i = 0; i < 480; i += 40) { - // lv_area_t a; - // a.x1 = 0; - // a.x2 = 799; - // a.y1 = i; - // a.y2 = i + 9; - // lv_obj_invalidate_area(scr, &a); - // - // a.y1 = i + 25; - // a.y2 = i + 32; - // lv_obj_invalidate_area(scr, &a); - // } - // - // pass = screenshot_compare(fn_ref, "horizontal stripes", 32); - // if(!pass) return false; - return true; } @@ -134,16 +100,13 @@ bool lv_test_assert_image_eq(const char * fn_ref) * STATIC FUNCTIONS **********************/ -static uint8_t screen_buf_xrgb8888[800 * 480 * 4]; /** * Compare the content of the frame buffer with a reference image - * @param fn_ref reference image name - * @param mode arbitrary string to tell more about the compare - * @return true: test passed; false: test failed + * @param fn_ref reference image path + * @return true: test passed; false: test failed */ -static bool screenshot_compare(const char * fn_ref, const char * mode, uint8_t tolerance) +static bool screenshot_compare(const char * fn_ref, uint8_t tolerance) { - char fn_ref_full[256]; lv_snprintf(fn_ref_full, sizeof(fn_ref_full), "%s%s", REF_IMGS_PATH, fn_ref); @@ -152,17 +115,19 @@ static bool screenshot_compare(const char * fn_ref, const char * mode, uint8_t t lv_refr_now(NULL); lv_draw_buf_t * draw_buf = lv_display_get_buf_active(NULL); + uint8_t * screen_buf_xrgb8888 = malloc(draw_buf->header.w * draw_buf->header.h * 4); buf_to_xrgb8888(draw_buf, screen_buf_xrgb8888); png_image_t p; int res = read_png_file(&p, fn_ref_full); if(res == ERR_FILE_NOT_FOUND) { - TEST_PRINTF("%s%s", fn_ref_full, " was not found, creating is now from the rendered screen"); - fflush(stderr); - write_png_file(screen_buf_xrgb8888, 800, 480, fn_ref_full); + LV_LOG_ERROR("%s%s", fn_ref_full, " was not found, creating is now from the rendered screen"); + write_png_file(screen_buf_xrgb8888, draw_buf->header.w, draw_buf->header.h, fn_ref_full); + free(screen_buf_xrgb8888); return true; } else if(res == ERR_PNG) { + free(screen_buf_xrgb8888); return false; } @@ -172,7 +137,7 @@ static bool screenshot_compare(const char * fn_ref, const char * mode, uint8_t t bool err = false; int x, y; for(y = 0; y < p.height; y++) { - uint8_t * screen_buf_tmp = screen_buf_xrgb8888 + 800 * 4 * y; + uint8_t * screen_buf_tmp = screen_buf_xrgb8888 + draw_buf->header.w * 4 * y; png_byte * row = p.row_pointers[y]; for(x = 0; x < p.width; x++) { ptr_ref = &(row[x * 3]); @@ -184,15 +149,13 @@ static bool screenshot_compare(const char * fn_ref, const char * mode, uint8_t t uint32_t act_px = (ptr_act[2] << 16) + (ptr_act[1] << 8) + (ptr_act[0] << 0); uint32_t ref_px = 0; memcpy(&ref_px, ptr_ref, 3); - TEST_PRINTF("\nScreenshot compare error\n" - " - File: %s\n" - " - Mode: %s\n" - " - At x:%d, y:%d.\n" - " - Expected: %X\n" - " - Actual: %X\n" - " - Tolerance: %d", - fn_ref_full, mode, x, y, ref_px, act_px, tolerance); - fflush(stderr); + LV_LOG("\nScreenshot compare error\n" + " - File: %s\n" + " - At x:%d, y:%d.\n" + " - Expected: %X\n" + " - Actual: %X\n" + " - Tolerance: %d\n", + fn_ref_full, x, y, ref_px, act_px, tolerance); err = true; break; } @@ -209,12 +172,13 @@ static bool screenshot_compare(const char * fn_ref, const char * mode, uint8_t t char fn_err_full[256]; lv_snprintf(fn_err_full, sizeof(fn_err_full), "%s%s_err.png", REF_IMGS_PATH, fn_ref_no_ext); - write_png_file(screen_buf_xrgb8888, 800, 480, fn_err_full); + write_png_file(screen_buf_xrgb8888, draw_buf->header.w, draw_buf->header.h, fn_err_full); } png_release(&p); fflush(stdout); + free(screen_buf_xrgb8888); return !err; } @@ -226,13 +190,13 @@ static int read_png_file(png_image_t * p, const char * file_name) /*open file and test for it being a png*/ FILE * fp = fopen(file_name, "rb"); if(!fp) { - TEST_PRINTF("[read_png_file %s] could not be opened for reading", file_name); + LV_LOG_ERROR("[read_png_file %s] could not be opened for reading", file_name); return ERR_FILE_NOT_FOUND; } size_t rcnt = fread(header, 1, 8, fp); if(rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) { - TEST_PRINTF("[read_png_file %s] not recognized as a PNG file", file_name); + LV_LOG_ERROR("[read_png_file %s] not recognized as a PNG file", file_name); return ERR_PNG; } @@ -240,17 +204,17 @@ static int read_png_file(png_image_t * p, const char * file_name) p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!p->png_ptr) { - TEST_PRINTF("[read_png_file %s] png_create_read_struct failed", file_name); + LV_LOG_ERROR("[read_png_file %s] png_create_read_struct failed", file_name); return ERR_PNG; } p->info_ptr = png_create_info_struct(p->png_ptr); if(!p->info_ptr) { - TEST_PRINTF("[read_png_file %s] png_create_info_struct failed", file_name); + LV_LOG_ERROR("[read_png_file %s] png_create_info_struct failed", file_name); return ERR_PNG; } if(setjmp(png_jmpbuf(p->png_ptr))) { - TEST_PRINTF("[read_png_file %s] Error during init_io", file_name); + LV_LOG_ERROR("[read_png_file %s] Error during init_io", file_name); return ERR_PNG; } png_init_io(p->png_ptr, fp); @@ -268,7 +232,7 @@ static int read_png_file(png_image_t * p, const char * file_name) /*read file*/ if(setjmp(png_jmpbuf(p->png_ptr))) { - TEST_PRINTF("[read_png_file %s] Error during read_image", file_name); + LV_LOG_ERROR("[read_png_file %s] Error during read_image", file_name); return ERR_PNG; } p->row_pointers = (png_bytep *) malloc(sizeof(png_bytep) * p->height); @@ -291,10 +255,7 @@ static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char /* create file */ FILE * fp = fopen(file_name, "wb"); if(!fp) { - printf("###### %s\n", file_name); - fflush(stdout); - TEST_PRINTF("[write_png_file %s] could not be opened for writing", file_name); - TEST_PRINTF("%s", file_name); + LV_LOG_ERROR("[write_png_file %s] could not be opened for writing", file_name); return -1; } @@ -302,18 +263,18 @@ static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) { - TEST_PRINTF("[write_png_file %s] png_create_write_struct failed", file_name); + LV_LOG_ERROR("[write_png_file %s] png_create_write_struct failed", file_name); return -1; } info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) { - TEST_PRINTF("[write_png_file %s] png_create_info_struct failed", file_name); + LV_LOG_ERROR("[write_png_file %s] png_create_info_struct failed", file_name); return -1; } if(setjmp(png_jmpbuf(png_ptr))) { - TEST_PRINTF("[write_png_file %s] Error during init_io", file_name); + LV_LOG_ERROR("[write_png_file %s] Error during init_io", file_name); return -1; } @@ -321,7 +282,7 @@ static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char /* write header */ if(setjmp(png_jmpbuf(png_ptr))) { - TEST_PRINTF("[write_png_file %s] Error during writing header", file_name); + LV_LOG_ERROR("[write_png_file %s] Error during writing header", file_name); return -1; } @@ -333,7 +294,7 @@ static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char /* write bytes */ if(setjmp(png_jmpbuf(png_ptr))) { - TEST_PRINTF("[write_png_file %s] Error during writing bytes", file_name); + LV_LOG_ERROR("[write_png_file %s] Error during writing bytes", file_name); return -1; } @@ -352,7 +313,7 @@ static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char /* end write */ if(setjmp(png_jmpbuf(png_ptr))) { - TEST_PRINTF("[write_png_file %s] Error during end of write", file_name); + LV_LOG_ERROR("[write_png_file %s] Error during end of write", file_name); return -1; } png_write_end(png_ptr, NULL); @@ -385,10 +346,10 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) if(cf_in == LV_COLOR_FORMAT_RGB565) { uint32_t y; - for(y = 0; y < 480; y++) { + for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; - for(x = 0; x < 800; x++) { + for(x = 0; x < draw_buf->header.w; x++) { const lv_color16_t * c16 = (const lv_color16_t *)&buf_in[x * 2]; buf_out[x * 4 + 3] = 0xff; @@ -398,14 +359,14 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) } buf_in += stride; - buf_out += 800 * 4; + buf_out += draw_buf->header.w * 4; } } else if(cf_in == LV_COLOR_FORMAT_ARGB8888 || cf_in == LV_COLOR_FORMAT_XRGB8888) { uint32_t y; - for(y = 0; y < 480; y++) { + for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; - for(x = 0; x < 800; x++) { + for(x = 0; x < draw_buf->header.w; x++) { buf_out[x * 4 + 3] = buf_in[x * 4 + 3]; buf_out[x * 4 + 2] = buf_in[x * 4 + 0]; buf_out[x * 4 + 1] = buf_in[x * 4 + 1]; @@ -413,14 +374,14 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) } buf_in += stride; - buf_out += 800 * 4; + buf_out += draw_buf->header.w * 4; } } else if(cf_in == LV_COLOR_FORMAT_RGB888) { uint32_t y; - for(y = 0; y < 480; y++) { + for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; - for(x = 0; x < 800; x++) { + for(x = 0; x < draw_buf->header.w; x++) { buf_out[x * 4 + 3] = 0xff; buf_out[x * 4 + 2] = buf_in[x * 3 + 0]; buf_out[x * 4 + 1] = buf_in[x * 3 + 1]; @@ -428,14 +389,14 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) } buf_in += stride; - buf_out += 800 * 4; + buf_out += draw_buf->header.w * 4; } } else if(cf_in == LV_COLOR_FORMAT_L8) { uint32_t y; - for(y = 0; y < 480; y++) { + for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; - for(x = 0; x < 800; x++) { + for(x = 0; x < draw_buf->header.w; x++) { buf_out[x * 4 + 3] = 0xff; buf_out[x * 4 + 2] = buf_in[x]; buf_out[x * 4 + 1] = buf_in[x]; @@ -443,14 +404,14 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) } buf_in += stride; - buf_out += 800 * 4; + buf_out += draw_buf->header.w * 4; } } else if(cf_in == LV_COLOR_FORMAT_AL88) { uint32_t y; - for(y = 0; y < 480; y++) { + for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; - for(x = 0; x < 800; x++) { + for(x = 0; x < draw_buf->header.w; x++) { buf_out[x * 4 + 3] = buf_in[x * 2 + 1]; buf_out[x * 4 + 2] = buf_in[x * 2 + 0]; buf_out[x * 4 + 1] = buf_in[x * 2 + 0]; @@ -458,15 +419,16 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) } buf_in += stride; - buf_out += 800 * 4; + buf_out += draw_buf->header.w * 4; } } else if(cf_in == LV_COLOR_FORMAT_I1) { + buf_in += 8; uint32_t y; - for(y = 0; y < 480; y++) { + for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; - for(x = 0; x < 800; x++) { - const uint8_t byte = buf_in[x / 8]; + for(x = 0; x < draw_buf->header.w; x++) { + const uint8_t byte = buf_in[x / 8] ; const uint8_t bit_pos = x % 8; const uint8_t pixel = (byte >> (7 - bit_pos)) & 0x01; @@ -477,7 +439,7 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) } buf_in += stride; - buf_out += 800 * 4; + buf_out += draw_buf->header.w * 4; } } } @@ -500,7 +462,7 @@ static void create_folders_if_needed(const char * path) int mkdir_retval = mkdir(current_path, 0777); if(mkdir_retval == 0) { - printf("Created folder: %s\n", current_path); + LV_LOG_INFO("Created folder: %s\n", current_path); } else if(errno != EEXIST) { perror("Error creating folder"); diff --git a/src/others/test/lv_test_screenshot_compare.h b/src/others/test/lv_test_screenshot_compare.h new file mode 100644 index 000000000..b962becef --- /dev/null +++ b/src/others/test/lv_test_screenshot_compare.h @@ -0,0 +1,53 @@ +/** + * @file lv_test_screenshot_compare.h + * + */ + +#ifndef LV_TEST_SCREENSHOT_COMPARE_H +#define LV_TEST_SCREENSHOT_COMPARE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST && defined(LV_USE_TEST_SCREENSHOT_COMPARE) && LV_USE_TEST_SCREENSHOT_COMPARE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Compare the current content of the test screen with a reference PNG image + * - If the reference image is not found it will be created automatically from the rendered screen. + * - If the compare fails an `_err.png` file will be created with the rendered content next to the reference image. + * + * It requires libPNG. + * + * @param fn_ref path to the reference image. Will be appended toREF_IMGS_PATH if set. + * @return true: the reference image and the display are the same; false: they are different (`_err.png` is created). + */ +bool lv_test_screenshot_compare(const char * fn_ref); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST_SCREENSHOT_COMPARE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_SCREENSHOT_COMPARE_H*/ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5744d8ba7..82cac6ebf 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -125,17 +125,20 @@ elseif (OPTIONS_TEST_SYSHEAP) filter_compiler_options (C TEST_LIBS ${SANITIZE_AND_COVERAGE_OPTIONS}) set (LV_CONF_BUILD_DISABLE_EXAMPLES ON) set (ENABLE_TESTS ON) + add_definitions(-DREF_IMGS_PATH="ref_imgs/") elseif (OPTIONS_TEST_DEFHEAP) set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_DEFHEAP}) filter_compiler_options (C TEST_LIBS ${SANITIZE_AND_COVERAGE_OPTIONS}) set (LV_CONF_BUILD_DISABLE_EXAMPLES ON) set (ENABLE_TESTS ON) + add_definitions(-DREF_IMGS_PATH="ref_imgs/") elseif (OPTIONS_TEST_MEMORYCHECK) # sanitizer is disabled because valgrind uses LD_PRELOAD and the # sanitizer lib needs to load first set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_SYSHEAP}) set (LV_CONF_BUILD_DISABLE_EXAMPLES ON) set (ENABLE_TESTS ON) + add_definitions(-DREF_IMGS_PATH="ref_imgs/") elseif (OPTIONS_TEST_VG_LITE) set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_VG_LITE} -DLVGL_CI_USING_SYS_HEAP ${SANITIZE_AND_COVERAGE_OPTIONS}) filter_compiler_options (C TEST_LIBS ${SANITIZE_AND_COVERAGE_OPTIONS}) @@ -276,9 +279,7 @@ file(GLOB_RECURSE TEST_IMAGES_SRC ${LVGL_TEST_DIR}/test_images/*.c) add_library(test_common STATIC - src/lv_test_indev.c src/lv_test_init.c - src/lv_test_helpers.c src/test_assets/test_animimg001.c src/test_assets/test_animimg002.c src/test_assets/test_animimg003.c @@ -311,7 +312,6 @@ add_library(test_common src/test_assets/test_imagebutton_right.c src/test_assets/test_music_button_play.c src/test_assets/test_lottie_approve.c - unity/unity_support.c unity/unity.c ${TEST_IMAGES_SRC} ) diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_192.png index 2b5b4b25b470da473d01225db8bc0a3a6b402a76..6b6910b9cb6f09aa5171fd4b20b9560ea14bc225 100644 GIT binary patch literal 2526 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ1Lsmt7srr_Id5+VX2}?e zuwL9V;ctHAPs20e8BDDvvnYj$~hnPTAYDl?)~NL3=B0=jjRj;!VwG%h6BjZ zH!iMX%0IPzLo77=we)z%ULr&zw2)vbNoQh`ab3 zzdl;T!XU)N&7h#Rfq@~3iCb>XRzLqAT;}sW_s(v#J;ut&aN$!Ey@K>ZP8z~;UTooH z^CA39^__}y=6P)21S0g`c`+y`LL3hA!GnWQufMdcFL-Que~09au6qy@qb z2Sxco=KpHjph*H0^y>yu&=Z?sz8V=XSO2iAMj9FmW;3>4d&$edAb*s5;F2{cQ(fx^ zC+!ONeZ97MHqWKanX5T;7#e0AU}EUt1T&i0v)5i0-ggL+_WKJR85p+EEkj;AeP+(Q z1G7KnzA1#HP6tE@a4`MTYVC$*NP7SK;j!KSqQ~0}je)M!{&#-q^O`EA56d8u2ibSM z`^oj-FvMp~>~YQCc6^+Ze~0Hy;r;kSObmN0>5|+b<=d-c`G=p`=H21RQ9xuta3KOK zOz>ue&G}DFOPk?8lBC;{&0ru(a8O6x2xyRV_^7j^!;UK28KN44GauPOxz3# zY6Hi3EtkFavT%jw`D4av^FALrYjEg?{MxzqIrle4L}6*QR-_e(PgaMut7T(g+o_ zb$!$CwOjrCe{cw&uY8my;h4b4aD+vS!NCW?IQX>Y=%1d>=Qf4LK8hROJ&fgK&{ssn z_k*J9_m_q34jn0;w?lH7#Q&>(;w%gw%<>Q_XqQGF)Pdq2YPXv}1OtO%BP)Y|FdAd} z=lrDeGb+vrn;#ZodM$TvD#HgMq*SZ7{kxs*LuDVE=bf_?yFSLht#D*u$bZZ>u<07p z_Q9OecO8k!URzqln*Zcx#W6@yK#z{;pt9qGAS9C>{c&D;uL48E_QGZ?5r!FsR1o)4J}6E z((il~Jzx$=J`alWnxUovv+lzebj!MHs@DK>?SrLicG70{$v84DC@Wu6{i7{lKl4Y< z4PX|YoyY~t9vkhKvoq9y5ZU6uP diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_255.png index 6bbcaaee4cc9678a18bab9282dd5bbef1e2f840b..94fbf1d23f41193c16f02a1546b306476c08c790 100644 GIT binary patch literal 3422 zcmeH~{a2D#0LLFebZU+qX3JD+6|Qo}I=-MALYmE*sMR*5GGSJ_jtLs8(0s$@7ISGk zomPqAS)Sfj2gr&n6``qgGT_S=&=lvt*Tsyf@1Y_Sh?M3EPxv1Ix{MvvTlC6DUS`;XsJpby5t_B@7; zG*LA>N2R*c&5KA0 z6mbiUL(Ck<4)tie-&kLI$;^%2RF441KCMcLmQGa8yK2fcK_r^SWG*mvqR-=`v2g3^ zG=6_kC<6Kj=EJqCb${^Kys57<%Lg)muo+AE6h%&dqeFC{CjyHy{B6<34|=AwvB9dz zU{%({%fg_+oZ7{$Qsum`<$N_7Gk!l2B`*S!E-1g?7SgP0w9{U>45c%kQo2Fe_)pwt z#YmG2Ekc7uSlnr3JN&DgPZ~YT>bvL=DMs4x7_L5t$!c(#XgACU&t{aCDNBMRcUMfc zztYVc^_@0BRzpK{?WHTBF}W26^M}(pig)FRLlNH_F%D>}3Buw!y2oS&htg(D^@f(a z2V~mB^7UjadFo=b{Vorj6L%d&ERfDb5CoJ8+%+LR(uJ%m#ui5Ke-~9A0&)(U6Yf%y6)3&SyjNUyRJ;kW`|H`T)#yWO&QE`ru|C;bRa$3#H$QKUH^CpxF`8IYM47iwJlbUytrQu})FU4g~2!DzUTo@S7Vl4u#1RW+(;XNp4k{rZ+3 z^>xd7AKo$7UQ?H?1Sl0AnbTcjUG9-TaWM4e_+U&rt)dhE{Oq!_l};Kh0IX?9DM`OJ zB_Cc&Sd*t`1DLJ=ILfzlcNUGQYT9>>XK-whx{|SJDvxOOagX-4HW|>VnZ}!I$KI6J z(S~U!N&Ej4EJAd_VXS3WaX~kc(Ryt){ z;od7%ST6K13RSo>&9CzY2ejSXQe&jfs%>I3t4b1^^_DkGg5rU^)GjdJCv=~@Ws?HK zZwEz6dSJmQ9-Lx20^1BrKIbdfwVs&_4rI&Mg04b@2a^h>#VRvKm7mMw zzU!avKrq>lHGi)e5xZ#jkcnsjC5Wa9Cz1QdijXOQP%jJ=b2k$=YO)mdmFE+!JE(NI zxp9Q%Aq(YGFN0k5{*0)B(=js!&rbKvlh@?#mb@h76eIbww)QapJpK03}Z$e;le87 zv)(RCXuF$)A|su&^v;Upt52{dE;$P)l_HjQ9Dd{y`VMm__yi9lT;+Uo0&g*ieTWzm zTeC~)1CGCX%0G=RgOK|EZ~<}(rPw>l>g$SiVs7tralSrJ0F5x|3!BqB)Lh=z-mf(` h_u}_D&xOuY2;L`- zSP6+pi!{*$4q}o50aS)^FhN9CBLt%vWhur;1&PqfP`ddlJo$RhH*@d(egFHvGv@;X z{ASOBW&r?ZZ`7;Ytk-m|2DZ zZ~$ix7H_8*fU|gKaC-HpJmhE-5w@5OGt*`%s!ZdDuwYaigs4Sy4$c3zo&1 z>?~2bu$oq4ygD4Gk|1So|L+Ah(nUs zd&c4!~MXicln$3>k(b|NWB~J(7+_t)}z%nU2aW zs>l_~(DK)N{n+tG!07GdC;3ft#PX&)Pc2$gea*6{I>lcwbNHr!$>{ z4UR*}zvuZCi1DFptdiO5QeVYu$Jf`5o9}m}Wv)eawDB(;^#W8g%}LqbZq}?-SKmJr z+jild-ThP~59DTEIB}#+V#`AV{t-f#=t?=NyIf`qFil|>j^BBE3lh>%#JibiMl&ox z2P?;Hx*ZHy2hwnFS>_vOXuSDq*R6^Sz8}m9~MP1 z*jXa)&0hfAmXuuUR?lTf-~O6B!96&UA%uwcY|(dJ)7W8;#(^~BEUK5EecnabddDfM z!eS81WS38GlL;24_A4w}jjZf`E)9lU$q1UNvHI|7!*%jq%+U9HS?!WzYh8HNwW!9y z0PJ^mT219+>HRmIdo4;AUmdA;7QG?@RwFk({f$_bLv5ScdFi#7d;y%^hN7r42F9ta->i*uwL!4en4W|HG1x~5n+tp@3kC5ciS=~ zE*qx5ZBbvaFF5$z5uKi{`c}i!KaG*Ph6Bqq14C8vaCD+-JZjl3dCQv!4bL((|0n}u zzB2}LwdeHi8_b-yM_l4N>aJp2#$#C2$=3GaOL7ra*$b0W{gedy>zkIoiq^egBz;pl zctq7Gdm^avRD1Lst+3^do-66Lxo60v<#WeUMac;F5OTEVFgg$30z!?wM%r*odx(N* z%Ys8O@C-89;F`AQ0seltDv^qrJ$oa%=%A)%E^%noa!}G2g~^bA<=qaBtCWBpnS$9U z%bQr7*EANSiY(qcv5YVTjnfwk$<Ty^|B%;M)vh>G0?;Uw_^r?z3o^m(Wo?71HVe&76wwEb; z6rK7NK}GOZu|y=bvbvv_NcHl@l!x*xO&8#l!e>kG`ln<>v4p1B{6@_SiA#s+kM*UY zn^bRulV0{PfKvV@yMYe}XJAD}w+x07Y0ezMJeTDR_oyV}DrHfX}SvU?S6C-eMZ z^y~BOFoe0-g86!ddOH|R`?t{)>6!MB8Mds?={{fZO#N>Bf278&@0hKuaY?8vM}MEd Mw#@;)0v}5HpY|V+#sB~S diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_192.png index 7b95fae3803900caa363ed073c05cc0eae90c1ef..fe506e2fa5da3fde05d1f5cdf1b275d444a75ed9 100644 GIT binary patch literal 2247 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ14o~yi(^Q|oVV8waxy3g z955*TKli*USCfkHmz%c6+zbupDrFfMK1esSG6)z)FfbU7GDZVoG$oAYg3(+snhQpA h!Dud^YA)EwU6#eRmv^4+GhhRS!PC{xWt~$(69D@^T0{T< literal 2252 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ1IJ`f7srr_Id89R%7xv&%9(|Xz2f5!oYCgzJv}#!;FJW3>}iAjL|?CO$np9 oU^Ewu=7P~&Fq#XfnhSC*df4_pRoI~dY^5-Gy85}Sb4q9e0G_I!t^fc4 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_255.png index 7b95fae3803900caa363ed073c05cc0eae90c1ef..fe506e2fa5da3fde05d1f5cdf1b275d444a75ed9 100644 GIT binary patch literal 2247 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ14o~yi(^Q|oVV8waxy3g z955*TKli*USCfkHmz%c6+zbupDrFfMK1esSG6)z)FfbU7GDZVoG$oAYg3(+snhQpA h!Dud^YA)EwU6#eRmv^4+GhhRS!PC{xWt~$(69D@^T0{T< literal 2252 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ1IJ`f7srr_Id89R%7xv&%9(|Xz2f5!oYCgzJv}#!;FJW3>}iAjL|?CO$np9 oU^Ewu=7P~&Fq#XfnhSC*df4_pRoI~dY^5-Gy85}Sb4q9e0G_I!t^fc4 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_192.png index 37721ec5719b17096ae7271bd9e95e99ad083aef..5aa167f1cb1eded823a9c3b7cce35ee38105e561 100644 GIT binary patch literal 4704 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 byf;q&?9O5BY5fDxmm}cn?6JSpk&^fif5UY} literal 4781 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_255.png index 8d6eba6a8ba80eebce771db2bf2753a098f86961..847ac8b96413f6d4f028e3975de1a3d50c8003d5 100644 GIT binary patch literal 5848 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 literal 5902 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_border_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_border_opa_192.png index 7157961b756b386207d04cefee64acde60d140cf..8543eb5e6e451fc2b2c00b732b9e840bcc619bd3 100644 GIT binary patch literal 3243 zcmeHKX;V{Y6n-HZ5J6ECv6Q8)6>Vf`0|QtDs?rpfSQTY0L@c}-&;tYm@NAVO@SS>GU*ZFx9ZNZH z*C#Ka9d2C6adMt_3_hr-lDA&Mhf8q0U`bcL)Tnldm z)-%-Yp>z~3rSe&S0d##S%ApV8mPeq8H1JrQC-G)r7^jEeX(iG-=NZ7IYlK3H5{;>mf!QDJ|FS0#}Ok)A6odFB-Ew#aHB{J}=o|5}Mxe z#vGa2`%~sY9kdBV2_?6g^|Y+hN6CT=!B1nec@)dgXPrBBzi)-fN1?II>IZmmW)`fQE;qrT|otf59oRhVe zQ29fG%qZb4fZ`a|<&}R>%0&aL1GsRa=jU``TnwbRSXF-s-u7@VXZB^cp<-y@3Wdmm z-o`4F1nq?bxsO>nr%LFYas<(twmlCRxlg7fQ9$>?Fy~)GX^g7rF!%`?+bpg+^S1$g?Yp)VyVU#w(_qI@|(2JBF^%94|tPHa=0VA zi`B>ZowN)J@%Kt&oR%xO5iE&fSGAGCrJZyRPiU6!v#%b1azMBk))|j!Gu3bp8#YJa zi4K@)i3PbL4D$WD)^DOTQvV%K=BJjaXKKnku(F*x6ZU47thfkaKTGF+hcF(H8a0la zPkv~ofOlfWf{7O4A`Wp_JI#VZW_$TQy}~=A33=VrxpOQxbrjXLAH6_*Wrt_h8j17{ zvus44t^!sFNFgK5DM{^F3)F@d3zCYxnT)1M0|{kG&f3`V6ZlfK)GM_iutm3H+952( zM_8nOy$w!mC`Qbf{SsuO5R5l7=#EkV8PY)ep^~ zc1@k`qtS@Wv)Fi3R$@=KHNt%162crLZ>2Fuwa*i%MczFo3UaMj>RL+U%@+fFaE1tnUIbcm%M2SbY zK52sjlT^pkCEhTe(WF-+%;%g&nolM}OCxmcM~tU>I3$9_dH7)qeE z?|46NOM|x}yg$;*b2V4sU4i%C3%Ak<%ial7y0QMd_v^#%LdYWo`1|4aKiW%3`v)=+ BI_>}f literal 3244 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 BI_>}f literal 3244 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 hQ}HoR^#VeBanAZCd~U diff --git a/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_192.png index 753dac9c8da8fa3bd75d061d135bc18383dacf15..77e99c0e8be9d23994a497677cc1966aa97bd9c7 100644 GIT binary patch delta 2848 zcmX|@c|2768^_Pg7-N?T-O7@3D@%mQW-Gy~$P~Mw6RD z#&U{EhC29_B3pBD$yTDq*tf}&euwVsp1;1|=e(Ztea`bdpZD{v-166!$7;2Q?8X#xWn0APc^ znWCTzf=#^uq0?C585l{%c=V%W@s#S={ff0A*0DZyc*(|c6Al(w!)$fET+0%bI**mbCzf)c^b$XFOatfaxYhszDb&6Ta zhx-qcAb$t2vvGOBb3Ra?K_qhpOQN2O;P+q&WaXvf8vMDH5>+B#+n{lRuX62;LSdut zhS#B4KE4%8-0$%L@3vc=A3c$Nmp5b7*Yja~db+JC*K+XHMU0POcx4yw5Zg>&^@G?R zImws=vDrhsQ!j~BXh^8W6Z9EIPkZA94Z@StnMEE?{R1LQdM4fb9Pv|*b6}(ysY`rf z#SJZ{t4Fg~)!xgp8h=XE`tApf;o)0wrulbO%fFLbCM?LDP-+Lgp zt10KvgpXu7MoP&a8w9?t*WYGUmHder#7%$v^m&7P#52Fn{=&H0ygfE$)vMM8~{2E?8{!I$y#$QAk4pmt_rr7~?z{6j1Zu79#oJ z_zyb_{-DoyizkI=FKh(XblB5EW7g@)_Wj!5U~bO{V6aSkXc6wUr#~lLGr-FRtNw-Ns(0i+S&CZG64D4^@yQH zN)52N4Hsnp6ZqtW00U!h?pE3k68=zk>8Y8Cd9k!N3e&ImI<)fpK(Cx6X(CO8x~M`4 zDGSthV0=;)Vk)$uelsB{@|yH32%d>alQkgp@!fujHw(J0*`m$CD!LPX%nlFS``9!S z!;~?gw~oRuhn&A;sdG(;{bA_%A;O!UD(@Q^8?RIYj2E{xZLYzwN^~&J&_S8Ng9~Vz z?d%fcTjV@%Yldv#V7=e3tRQnn>V8iz>zRk4n-xccl7yy*wBN{)RGQZMWa(xY-d9}{ zfR(pzl>-b3X3!Ndu~I1B5pv3KB?Tw3@_@DzE%p7ZoJ+?hWgw~D=d)Fm594EnM|wB! zfso(RrV6B<0X?c&QQG5^hp9FZkKXr4W8lY0)LdU?;P51H;m5b{TBOp%j#i7b3UoHF z87*#m6v8sN+pdZe-+N?f3GCPzk`lFOH`#F7lDe_a68P2?zN(G1QYU-dAMsArXtaGxy$A#D#W(7 zexPqOd4whlOr(*|;Z`aO0KP%aDrlq?RBs+thydrlj3|B!+Hj@Re9M{5b*1JX6HfZ~ zE^ls{B7m+7w?wFfAYF(6?^In3%S(&{yf{BwkKw6P3gkP|R6CqJh&SAm-ucQ4FM3q^Q~gj2jYYuiKbpi=~@t=*$HU&(ixg9SdN<=2jk4~rZl79 zspaC#oPO%4>)et~yRkyL$6ic7(5sgx^C#4LF{Umnsvzu&c=AyI3os`^{pnTeWvBBX z5vm(O<}WxSy6Q=g1t1NjP}|bPxsXJn2aM18vtU2jLb)vSy)kYX?)q9$xj3%`_|q^? zX`T^pt8ZySL?V=DyHgdOajoRya+}y=)ic0ZDK&!&o(gHF)R3-2-djN~3LYN~g_z=; zR9y)xJy2^eMHuuyq4GUp6(L@PN<|{LP1ZL9J$w~~7(EpVlpeU79yjZt{52Dfz0|!3 zcfC_bHt}$5j-#h9Yh4MF2rQC_+r(OYFjk$_Y(mWb4K3d!IqmjZr*R{aio-P9{c25M z)j~PF+?1HDftF`VUQyv5E3i>NE7jV_pJkIIrPdglEQk_pGaVdM7(=uJBH~$5%+=(s zvKl0zo1JOZFCOD&`A=d+s5@&ZExJWeoCp=QI6k5nL$&v@E)zQ?3{cL|Bd$7@%x&OY zaj37kP6~CZuTAe zHr|Y-*n-7y1yG2wm=)_tIwKMyXGv>In~k)X8)<2D6rQ}m=(-cuN^t{cMx9^y<>Jlda(&BDnHkI%5 z_WPtmpRlBIa5gW`DB9v^{xhYPp?nPjDnEE9GyQ2BIi8T*$9I-K} zQY70R-QOcNDF6*pB>bJ%_IX@Ipj3*q(>uT(T&3H;Y|nw^TsYo9jMhq&+aY?xWIUzT zn6ek6-QYR6ev8VU3gwnf-=gce7cdU))v;6qda&=R%4k=xMF@#)Xw_?1TPIx?(%Zp2 z=D*>JbW)v%Z+m?mPlO_Gh5AiBR-mz~=HS?bu6h{5mj&7clOWo<-%SwFyQIRg3akFF zWDI14D+qVF1jkmaeu0|RUj+MPSXngmatwim=sq(7${1?}>Q%{pgHd(3$I}Yjt zWi+8&`^@vl)UoY)&>w@77#qdD651@=00;c@w%zsefOSd{=$lgvuJLAA0+tKm*Cqmw z4l`lT<^EAE;r@XUa#h9K6BL)c>EmSJ_!M#xVdeXrpYZusF#ckTmS`8L;sXt!>;Y32 zg(ht?M(}vUHu)g3uq3l8ka_2Nf`v!jF*5MC={gFdSyD7J%-4MR@{*WcK{rqa0Q)Hm zN-CabL``650@1;3Vwz*~*Wmerx*tnlH%-OuX@(d6!nk}mzp!Mm{Hm{UVE3YEA3v^k ze#)^(6=o{#IUv9PY={A{MuJ3@X%(cDEKi;7G2iwn*kb%*9uT6^)Pme~p1;v34OPTr gO0$)ApwzxAw^wqHV!F2z0pvMy(CI+&K3eSm0ZyMsiU0rr delta 2876 zcmY+Fdpwi<8^`Z$)|O$EjmKe;9G=(qP_c-dk|!0ZJh9|3{USnBa%c{>v*dB8esVrU zjT%{@oGl*JlQcD_icvWaVTLjMZauHx>-YNIe|^8N`*mISb=}wX{(SDMH>#)aF^@fV z#PW~OyqUod!Otl8_zztryv>YBOv5ktbas=dg>89GV0#ujRkIMaBeCUG%J)#A766Dl zz$ZKah~lB|ddTbn*8_#yfCj0yxs}8aauFPB6UvG~im8eTlW6*`&u6 z3?Q;#9NQr$i86Lw4N z?KtIE8Ai7_Y*kJbQa5(5@kKG@!sm0JBc9E*W6uU>j=vrwpRe)jd{4O8{GH~XdwC>T zW!@W{_Ng=pgQ6txEp=ZzxXQB&?h`iQ)hk+qftAr3=yJ2p!kD4vzg#w|EA@s>H2GE3 zbr4@nIgP7ac&*)Xg_EEkVogYi_z}e2YSEWP*LTIu3m@I+ES;$n8jwS7biVi!9PHKU zHvQt7%-^ zz!83h=dKjfnV?Hp8=WUz`>rW((sp^QEdQ__d?_6wlDPfoz;a35xEn&RoC*Wtwv&LU zy`^Xv(E7hCh$5DB50P$`h0hAbK28PO0OWR3&Q*_gv(5Owna^QhR05i$bm~%cm%BEc zDjjX@6ZCN^`yHH`ojmY}>E&v7i$(wxc2MMdjx-xQy$$5qQ%|3^`ueep0S{1$wm#UY zc_L6*iv2+XUt^#|Ou2FZK*>?$KVD}TG|dASe^wN2jZ-ZLf>;>f2zsl+XzT5RU|q3>bsHgwShRt{gUOfmVr3-WY=nsQEI~TPlCli<&Hm%vEKfE2QN=E z+w=iW{vr~ibA$*)$WqJ|H-1b>PdcEE_R0jqqR?A3X|Z%3OyY_dhJ>i{2A7eIrAA(B zP>pU~)A16g1||_G7^EXXK0ms#T_XaOlbkVjKryOh&=cvq5bQH00uDxmuO{}C3&_=} z51#;84NlYuWBmKHQ9=E;i*^S05>Wtca8>@R)q2T_KaP|6Ef>X(pT$u+eiJVJW-`)O zbGbR~cxMH?C^am9w|EV2tEb>)y5aCI*V)thxJcQ0$tdy_1qzu%Ky}2YU;ehgXsveS zg|s{lP&RPK64Ssmt7oyAKtN2GYb+87fNwPvoaqn;0Hsf3?pn%(fE#smgz-M9ww_$s z1F7G8a_8C)>Q|a4G7oWv{vGK_?=p?H*4KU1pGljdpxH|B4g{cjeB zwIuLouLlfIQWbiufU3kv%jJKzG3J3l;c0?LZO_|ZEOs`YmC>|`%V)p}0%sqU>br2# zOu2|N`52|O;?7neXe%0^psA}k^s#>JwTHtKJ{H- z?Wtn_j30P&c%OHCr7f0HDN0UGK9nyE$zIBiB{%JMi}^T1hu$2f!iJhm+sHJe0=>nP z9$*FW#OFT#(>jN2i>=?oipq)?xEGq~DrqrLrck7UawKAQUgW#cdTx2V-4;80jB1$` zJ21k(^DfW)(%w%HIYlzj?ZQ`AucIe(fAV4t$58H=mJL#M z{l`(ERpM;7QL3wq|FzGHs{{>$*OGY6S}7)j8>!=}`*)r>l#ocVPrI| z#L3kr7U;Db>V1=03svF9n(zaVzOy3Rp$-S$!Ya2z)%~RWRK?D2l^TRL&_S0e|23%q z%b_Xzj;dzkcK|3Q zqEr3h;xLs0RWn$WkwP5;h?Cw@UDjH`ZVABXCJr+B5O9gpquiC`q4s>LdM_<`bcy$WV@lUue#Vs6ZA{|))X+pm})sj=)N?@S;v{#ETiY`rVY_2SY{kyXVmK)o= zokZ2EU_t7!M|m8OgBc9fvH~(EhyM`_*X}k&iyL>fGFetO{P{T*(oLJ80_Yi>RpdpL!Y7=arTdl15h9k=+p-C{A4sm+PXVMV71r+3| zyOf4_e6Ah7Ek-H7v>rZuZk$LFSP64tms^{jM_5LFbSXD@@e)v}VB*UE?%3ZWHe{E2 z-ifbaikf)5#o+uu^Oc-mpZSLicg}Lf;-nkLedwjo2(ls+0MLRWZ~3M({_8`=E-!O( z3qO1btQ_AIPhy@~cIvYtCjb&NXy7w-V=V&HGQS+2nQ0%n!Kqx%8Tz9FSR(ez;u2f} zNPv8|NV4}(M6ZgP!fee9X2(1^KW&2nus#Y;z)cQrz<{3GH>y?pq@58}R2c*ezpjv{ WntOTyd8Gw_o@3T0k32a{jrk8P!(`n6 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_255.png index 4c48e186878eb9d5b7a1a5323c4d07ffdcaac257..9ea277edf5486fb5ee61111db34897356a955f5e 100644 GIT binary patch delta 3499 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 delta 3519 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 O=Xd*aCrfNeasLInr|J0s diff --git a/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_192.png index 151f952b62774d5dbc588def5749a5512fe710c1..d4444cac69e66fcf175a255e45cf1bbf89937c39 100644 GIT binary patch literal 3508 zcmeH~e=wAJ9LK-A>(`2-5eYDc5&@m*Du#3>d=}}eoYn|DJRRemQtziVn#X3 zwtG`|)FsPQBtLdZIqcerW3hfLwsjGfW!bQM4;S^vbz|=4rkR`m`#kTN=Xt*0&-?Xx zKi}u_0Z(^*T{B$(fd1aEcYOl@VjTc5u?`$knvOGXK{{pcuCIK^jNz^qQKIK2ZZBlj zYIQ@of#YCDky%}bnMFFOVpZ6=K3?jol1=qp3aVNYxDC+U4FHJ7oaCsBB1J_po&6e4 zqStaW1^tNm8m`$$APm%Km;g7Ak5&{@d(xONAol63f`e3~ElA4ZLPbT_oAZ&PLycp3 zSFz@yEMcLbv#$*t>&>~;X+SGemKbp++Xm3DQ6Xbi7>#vFu#k3_czswyNB%0}Lq!`AR&7&yrcl368XC3NPTxA79$; z2Y_R;CNMPm_eIeZw_|Fq%|#WVN}0;yTu~Zzhp23%UgSgaxI|S77q`$Osz$5CGRIn= zxKl@>V@0>E*~iCE5FFyw8wFZeN%Pu#`hbFWm+2U@8Z0=CiP9nW zl;%cRxZEfAKB)tHBYY?uBe=1jVwcNDV8hE|51kYhldo^FA3qcFuH~T+8#2^FE0*?1 zDI3^gN70$+Ge~J)w4t7clO&3NAlXljEZu$D3I91(aj)SL?Noy4O!-Bs)TCBRrrV?4 zni7*(t;fa$eQy*>euN}391yf@*%OZ}*soM0znDgaOGbG$qlHhG7)$e`8aK>h28`(_ z9bUvs1UuQ%|@JCKikO7xukj=nkDr3DpQ5GM5@pya+;F2*vHWindX$z1GLT6TG6 z-Gif5k~tQ3jm(e}whFAXE(9QWG#Ra~oR~$9I?{~g8_R2FeR(WdzI1eU7MV!maVe zo3qN*8AOD|_^Z!ac`+2Jk07h`7Tp^cBE1so8H+{*T%dcy@bby^)#1eHMc(Tl#_rD< zsL!o1X_ms66MPiZM)`-@sIr#h^8J(vs6xmtw!L!#csa{ zn=TqfklG31ZI~Vu*`*c*u0kdk>>({Y2MkfES`95>`ty8fi49rscNbq+CcliRp*u5S z&glWoh1o0cfWchI2klIe4dZgZX;Mh(`A63w-9LF=UkZ?A75P6asQ3g8Ab#16Xt=;a zox&obZR6%KfRoTp1R$Ppg)izqdc_s`XS5ayNNq%LZG3Y54&hJe`6x9_+Id#4mq}_e zo2e8HYM$5%h9cEeWqa{3QGJwv)=K!Dd`1r;3!yOAQ)!8VMc9X@f9js^QzQgRfX#p@1T?II_wdfV?rqFvr-J z!5iJ#q3$qGLRTVfW1r2V;x`J#T*00NI(DAbwI!@?tQphe9)!GXNnP-G9Va&ky*d#% zudyJS$kTWvh6?S>6?kGFSxfBq=f+zjq6z@_ z6;)$VcVmqNmRg^(zP3oxhJ_VcRmN*Ipf97^r@E~4xxu0UHcq6N;vfJQUt>xTnT?~kUs7y=F{6h`a$xO h1)nVVkN#s+2IJ|@v1C<_1@t!t_U`uFRj?!Q+#k4w@wET| literal 3540 zcmeHKX;4#V6#bGQ5;WE7#Fn5?EydQYT1?o2sF)%a!37OP)S!bA6af+Bv6N6T3{p%j ztqTbWrB&O8B@Bp5Se}NZ4v-+qW(>rtNd^#7o~%mJ7n?`Nnf}mrYXA7>%$slCvmzj;8L!&noY zKU^IuPfzKK`t^fLMVyBEMlzj~7r!CE+n$%{u80}20>G%RRuKU3MM@JnUp;V%c8gU8WEKi*RW;#j$xM48|tUe3>$1h3t zjsTIHxni~L3k7@;H$%U)zGO@r>O2;GHhGt974lUnF4xlVYx2|jrf!l!SE4x3!4^i- z@;b|yY1>3DyeeqR-L_Vm{|4o?yPB(|uNrR{TGl$NBpKp z8;J#)L@88$lv;cqL-+k%MolNH#1*At)1LLLA!Fwq&-;tVnYSV=~J4QnJ~0YX2@(`OopyKhyW!0=*E_n3hgk~JT#r+Kd*i;C7mS4wl*TQHorav%jc zDCrQu31wZ%+^xy^F$@e<8@1bX0_!*%av-nDy&^*RZF%gartFsTqH?Ie;Bin{6G1so zI(76;sdU_h_VHs!d*@+@^t91QZh3@ai~2+Ao5-*NlH5rvcuJ=RhIH~)M;eYTe_Fv! z*4VHK3BHC?PwP^GW5oXU*qL=!GULjKXj!B&{dPl#*?7%i`&iU_2+1jFhm2yoZ?v3C zr8UCU)ZjB*o4jTi?zyT=bR6RfTZeoHNgm?fb7|F2f=>y3^6JaraH&G6@d?|(RMJ0+ z=ndy<<#&r1O1eb#6WmiFbH6ygPJ6=5jMw;bakDGA?~{d+oPo!h&aT#q(-`*WK}J6N zSgpn+7SUvQnuBD#`b@t_Po5C#%oz2HA$LGDv+dnkC4H8PdM;XSnV%_dZ z+&VOnWK5IPeT`D6n{VnZjm36kq@}5}QVcD{P_+gzI4dkOn}`M8y_G80)`f1&I~b~t z>^d(0nRRA!>X1$<`+FA3;DnVbtw(l}m!c=Z%;AmQ2}SD_4$XU6EDyK-VXjS8VMrE6 zzPg)I^qFk>rv3X^9&z2s$XLx}L)|V(e9{KRadEU9o4^LcN2L1b_^(s=$n+>z0-@pdev-)? zmRIt_s;>{O43e3C7Pl-sfCW(sLqzQo1!$)(l+d%z)U0U3-@C|dZ!Gu=CBxi z@BMRSCrsHx2yXugPKb9b-1EH7cc@Dxc0wPqKpQ50M{*M|kM!B8w;Cr#T~B%j=Ut>6 z?{ZVfm&2dR2-5(oGPT$W2Zl{wd7id?>=DpCSnnC>fAuC$)`w7r&#?t0-AcW8ztZ!N z;gH^&hs9mfg~|m5<2BF|bIU%@H%0EHotfnjOS(C=6-qzqHi0~ zV&ts>LC@^m#XT4vaw}e|4UjYl;P9%;e0Cxe3Cb~}^q6KMQb?M^H*F3da4ohQMH?q( zSLLUWG4yM#MkZ$8pm?Di=cP{$jh9+7P-TI7n-=P~!^LMrPA(zLw2JG!L=azV3MJ?v z0Yp@w@$>&LFE7;=Z(e%cJLMb3-!T5VE;4<_!`?2jwdgGby{!QshTpoPwX84y0B%C$ AO8@`> diff --git a/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_255.png index 788ae7233e1f39f638dc42ada1970036c8c8063d..950bd9264c68aa99f99b14546d18535541898609 100644 GIT binary patch literal 3606 zcmeHKc}!Dx9RKwYL}7wVjew{yVWKct2f`>V9)vMLHX(viIg?E0uK6^$l1mM7U&*oJC>gVR{UPaY?9e!bHBTT+u& zD-v%fwBI&h~6@+}|6; z%-nwuSKc54ZDZ)AV4WQwfN12u6$rwe=tL<1W4p0;k>G^UWi4{NWWIJC66 zlGzxhdY?bjFzpdtSVTD{Weu8PLcU16>MJHZ7MDn3pli;F4!uMiiln^hMG>S2>=*UR zMqDY5XNjIi8#Q=}Tdz~rNmH;+Z5FEPacky`tyG1$Q0v3Q5f7$~B3h@5Ir#PQO9TJO z>8;I9t|Gu&!oT-zoNU)Aa*M9m>h}Jd{_J66yHRbwj8>gN$#GS6vOQXDW6BOf!TE(% z7Z^ds&Ek+KC|D@X(4L6zT!ACAn<|n6nB33F;VqCyc`WZi1%+lvP7iq@AfNJ`f4U}_!;fJ^owV47a1&{hoXJa4bvR;WXh166ZIV@|yV1*fjn-R@7p z+hmO7JK<*xx%3-SQU_7(ZYeY?Gi=KxWz`$|GWkCnVXVmY7WQHx$F9c7JO(6$AW4!| z9Px~;c<&RI-)U!Ja-!W+x(Dwe%a7JHAuLKM4t!Jj>upQoI!P{M>)x#qND{OHr`xc# zOQH{k`z4dXs~4BhI8(-@jqU1p3~kcq;+w`ai%X}Zmj(jUPEB1a#6NX}c+s=Dyzgcu zQjY1ZWA?iK^@DhOa3f!Mo8TlZ?&Cmzmq`QHCB0-XP2n|?7+CooJKh0h9MPGgwU-)n zDMaR_jCQrS!eO>LG1G)Hz^|^-SKiW z3j14ADjy;YB-(k@vs#-O{fiU#Y#}bsVyI4v8R#nn?HNt(waj;Hpc?Np*+rVgrdsLt zXcbkhP<9K*cRxMMt!wWXa2>*=vrNt>1Vti1yl36PkLSsVdX}yg^lI3(2(@Ty7&)Cf zfK{z(9gjDlMZkOiY3(Hs4}IGHCg0o;I5_2M z@&=7_=(_PdB7tf-Rv`Vq>EI}AO_9a0PYs#Tg8pzKoDHF=!5qXJFzb{Eun%X0p63dB zdw5SU)3-LgTQEGx(X28~ltVqouwAXHI62~B__ESFWfu<2feCC*QP^&yT3&w*Et#Ns z9DJno;&&ZtasA-`f#V+8hGP8>?aoYiBCFQnUtj(GmTpMyPko1}SI z%e$>yvsn*Dy6C}Nn^`Xcwbjq!b4%cX&fAxpgBXIcSQSfF(H`B26&|fc zw~04p=={hl8af%XE7=Vbaf}g!z^hh=p5+ZUmOmjW_u1)`aJ7H8wy_+MIv$h@lOSJM zq!q-@=2jNgot!f7j-GXZ0w=FRqtnwy*<^>+FuDa;{eJ>BL)zo(NvC(kX&%D= Pd%(|U*N(DnkvYEu8mA-* literal 3633 zcmeHKX;4#F6uu;i5lNv?Y!OA=Kr1Q=B3pG? zOF(g{Kp_@IBU>(0ZE9&5VnxMD38jtol)ER%Rk@DxpU{f`@Zv?@0@$; zTjxz^wK-}40JPI)$L#b#LpELa8|Q8U)3Z_sIx(6VT(A=;;) zK{98sQm0NeVpeGx0-&_r0q{l40tQ=gDj;U2F^D#yOb42VbO7#8n+?_{G5_aHbi54o zTk%3=C;$}g>!w^s-lyO0mVlSkRRj%mnUK9%G{&>WXlG>U^AdT8q_B*t53l*v*e=Wo ze`Yh%?c{I0yUAu*Ab)=fpWEntrhtSibfwgi;*K~=6S&%86BxEGEzh36gIv*bXI7&LS91z)xKsQAUPk`M3qnk9iB+A|$zZoL!mFAQ?{~HSR zwA}e5k$#89h*88w#WEOEv!Wz&?fY{apgd);p$kVgJ+W!ZPUcm^IM1xVlw|H6;Ecm~ z^b5H+S|5`x!zj8Y*(pd>JFKhYPA#!63Z(s15PF+)q55!c0ZEi2yuB}FMuGKV4RLOE z;fRI#e4!y#4`$UFkDLW?iT?9HM}Pn$SQ7O-k;*Rj!6j8GQ41<*b#y}RUGog~^Hq%C zvCd>q%&|Tan%sSwh*Uc(k3Z0#zA{+B>e&k~T5;5KV#y`Gu`WalJWD4Ar_x#q8$E;Tcuhl>VjPPUi$hcFi+?0G%mh8>Bt-B$=&g4HYNjUq__X?r8L*4$-F6Qi-4 zkzY`EIZ(eoXa_E=wIj`~I8)*XW6L&vc9o@0-x?!&a=);EBf228Ou$j#8L(M|8X@mz$SI=+gR;;OcC9`yG(Mq)G z`b!rn()we(HvTC*k63TI+e@#iryj#Bq%n%A_{Xb*$8&D-*Y;gpo{JWQoPp?a_wU;j z13)1Pc8kG$a_F1mawKgkl2N<9_(Sk z!fCk09C#~i{$)zomil(szPxgxBr80v3_~!;h{6Sw@;Q-Wmbb`mX!bkh=pQ$&vQV1P z0iyCG2SkNKoRb$1v<1B`@g!~c)>nDH6YPj}pd7J62|DmUMP?#ibTINyW1uZwA%W`| zP%6aDd&(#O5vmy5XLX@`$c0a+%Vd(4EbQ;nN*$TOlaUc}HQ54WaF|q-3K-Oay(FMJ zv3dS~4(#O4SU*pvsuZjwYrktkFn(5}lC zskC-&vISKSmFjxWri4}yc!NwlyD)I zQ#!kqKxf_zB1}|+VtbviUYB_Oy z?$?7wv6#^E+bUhxrvE9=gS6`v$oO+^Wgm?-%(Rc^!OSkV?p9f_N26LQBm163u?)KZp;tPF?*w$ zo?tsnM_eAmxI>=OpRW1zD`lNv-fun`ZNLD)dp&6|-Nsbmk!Lvm+?PW~5r7r~QS@Ep zb0i3ia72B~3FspaT%SJou}9objDKSMgWgs3KKVRif-GwZ5_-o0rwz`Ix%Rl@e*j{I BIc@*| diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_192.png index da136154c82ed97825ac3f0e172d2f50785db9eb..a6a899bcea6b745b6c0e3a728f8d01e6041e6b97 100644 GIT binary patch literal 6540 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 literal 6658 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_255.png index 8af8e3068eef2a4b17d674ca667a0177faccdede..ec996dc7781f0565360b7080f4b1fb855dfbdba2 100644 GIT binary patch literal 8064 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png index acd797eb68d10ebca57303a48e0634af9d0ed235..822ec6a7a17b0ef78cc0af805d3acc7b165bd288 100644 GIT binary patch literal 6122 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png index 711b5635d2f9994fe5381af6609620150d9ae857..c6200065d228f27e3ab586ef678614ac5d9c84cb 100644 GIT binary patch literal 6089 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_192.png index 86f31be36619ce859ae788583909260d5b13f02c..a902ba043824ba0af8ab3bb52a86070f1af22ab0 100644 GIT binary patch literal 3094 zcmeH}X;71A5XUzm;Sd5M3Mwi%Dzr0#Py<#%zym}^0v0UB6eRV6gewDbB?_1@YTHq# z&`}BmM5q=)h>8W2BT zkF62A*247?+xxVVy9-BF#POZKW)v#z06cWsstgQd-m;_uxE{m9eC>_IZX)GOM*T<^ zJ6$sv8`7E3nkX6^7RLkBo(;FE2wGEJmpb0u8c!PQ1DJK^I8qJ7-**rxYR`;}S* z?tc3KIZakfyF>KGvXp1({rprxF|M2&@&k6ayRedOUdIw$u++B zLQv4my?s+(JX(<-v>Xdz;&Vzm;gc7Z0r`=x0CH&*cRZ@3|Cu&a7pGBcS7n`PFDia{=qdI!L{Ll!7f%$W1-ep0?p zzGAJ#0xZ;g$wh6mr3lgscz9qHnCP$UM?T?a4u3S&YHk@adX6Bu9kQ+EQlXfpMw}MWPCi zH|_Z~CXJ+TVmI%`(f~i3SIdrKAna)~PNke&8QQp+DeyN1#f8&kUk#&;NRbp8bHbCy z`~bp!p1?(ic{*~U)MZ;CQ{0tHcTxuT8M4>P>K23IY>%Ca(=?;4GplNFs~wwY$-l?l z%;`FgN5P}GNl`}A=c|*`@3i3oGU`qtCg7K5v-0mU&40~Qk(ieS z!q{BB&QO2sl*m{Xsn>=~?_+(Z7sg*z_)lH_7d=Cr#Zn2;$-6+ARzFZjAD`&ofbh^< zMC{g!(yZynpKEQ<_x-CT9d}g1mk+l|h^^|Gq0$>Z{C99 z=E&P4u0!?m0H>@3wwY)HsnMwos<6s7iCDHXNNIpmk>*AlQ4I;a2RGB%MWr zWRnoX9Ut{zv8x~Ix4k#%Wvob+$<)s`{{Tl2s$xz(lYW8L>GOP(4u2kn2C!lD4K6zG zVo*qVkk~M~an?=$Vmu2F1Wr5{2sxooF(hK+Bm;ZQ0CXoqf-D=owrDgnQ!R>QydlVC zWhNa7%o{hCL?>F@qKu$C^>)E%v-xNuBwu_`yU1RihgrNP3oJ|~ vGtoN%JKj^|T-3*hn&;?Xe*pKt0jKpY*+(i~Lq7EY{qKXnZ=g@*7CQGgz#e2r literal 3137 zcmeHKYfMvT7=Bw?E*3f*k?KIvq3f1`!lojlc;m7W12|)}7K;bPX+>_s7HXlCvWSK_ z<1j;twBkmGT1zVuv`B5$&27lVRjC##M?_Fc3(|GS%4MfSW}JWbhr~Z8Z@%x#d!F+> zmpA9g#<RIw2_YvWbwPx_X5x&bRvmit45Blb{wv2b3AUbP;Xp)wQ_n$VZ3=`QSfuKR7w<-7*Rdr$UB@hHxvYfg@VF~^9^pcYcRu|&{6@R*nzQHGT@?pI_ z`$p5P1lLl1O$}`<5MXQJQhI5hc%h0H+}0su^HXlt~Eyf#3TIfSq^} zEc{@);Pmz(ObhMDew37@&T<7LNsEWW7%+x!?qDn*TR2QKp+4!u5daZ{_9sDyunPMO zH>_PL*FLWoC9BQZDK(70NZ& z#&P_%<*`j`dbw(Drnt{^r_NSpk|@HHM$8=&OmOON?);TPQ1 zMlnF6z$D;3!jZB>;v)(hOENwOG^<*!A@eD%A-t!Lm_?uw#Ho?g?6Z%Z8F9SfWDqdZ z{XB2!X+~OUk}<)hC@t~9_)!=0lTQL*Zf6-q7SAl;Z)C(zd_#=~h#Tx7d4tA;!NbFg zIj`wqN*L7q@9Y-cIr4&JTLs2D2|K-Zpoi4njXoL}T?B$f-m)cyoLwKTAwWZy5B`sNTr2+&q~D{GcQHUkh%O+brj>WZ`2SILhW?l z+)?iYvTce9!-eza{Om3~C{}h0ZLuyC77n&YCn}^YRXxKPW=2m9m*5~h?IzJQody|? zm(sUx2nx^jb^=XF^mauWqyL};wMAcl{L3Z;G|Ebf%)GDeRRYKw$LIQ|fgr!R&B1xR z=NsnpF@@3_jwu+Hh%p1kZJ>kf{W4-o=Fo*zJHiN4;MhZXFYBEc-C@sCiU8!!9#{rQ ztbdi+-@tBO;n=rl$a;_%Ee* z9mqJ25wg37IGz6FmXFrVgP~rGRrQ02cLqNrfOCjN$gU&kZtMvLps_F^NUP){Zi(rO zX=wpOXYlnos5Qv9G*EVhUp-`uvVg|WaV)so8D8k!8xb6g5gY^UHG?UY;zIV&3gHNO zw09k#wE^_f;yp!pIO~Ak=+=*jE;4Y?T8os`fZ+aNQoE|UU3WK@WeiJh#>2Nq)kt2F z`eF_aZaq}bQP)z9D(wJR1kgRAE z)-`MnT*mL$dQ7Z#1z(<>8*On6rvh(GN%}XX`5N$ehnZdDlSsK9ufWnd(?G2 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_255.png index c01ba9587eb594960fd739de5b097a987793dc9e..6d35c3ecf9169ce8cf7d15514a4e25fc56a2538d 100644 GIT binary patch literal 7087 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

yjZR*6k%_bjQ>%ZO|TpEu)9l!NDJcbgBst7 zrK+0FAkzbQhN-z@)hF#-+?3lM<0tPJ_Gqh& z+p+O9332vREx(Qh{i&eyJSD2KEhN9_3nxV z*g1iaTnMQC_w@XKG4_9^{*Q9zpTqg*aQ$i0( IwBX_Y1>N<_E&u=k literal 7198 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 F{Re(axGewx diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png index 99d9416b64a322ed2cf2e9c25a5b0bea10b45c9f..eeb3d92526e8dcba66e18759fc1b59feeed31118 100644 GIT binary patch literal 5243 zcmeI0cTki2(#N0BF@Q=7pa>Q$gyx9}y(pq!0W6SELW_bDdhY}gQ4r9JG?j7?L?n>V z1EB;w6s3eC5PA`a2%#8iD3Y6_^S*z)bKd{&%su}-vpc`t{qF4SXXklhZhBdGpUgf0 z0EA79FWv+IZg~IzO$u;vET8XYCZwI|z9787;z0c+C=`Q}kX8SA|x&|vH zOX;5!&}jWoSdJ_ZzAkX>Ad?xU#|D7*t;QlS0I11;z<~TU3Kt--<4Jc(YMcHc2f_YrnI){0*KhLoTzom`DI<-3aAlN%hL%!@vHV-tKvCCE%qEdjDy0$ZM+@)AgrFFaJ(b%y- zPO1*~A^_0%SS|npnt7A}oZA0N5hDUXGi{^EI{4{iwcL-emB}{cBYI0I^o>hE&aKPN zM3H4#*WMezq)5QROapUbAhLpEcMtf;%?>2!t6j&7In5-3C{krHP(b1IJd+Q zqFp&LyaR<^a{>X=TUybTcf0R*G*a!qGnFkxNIvHPoO5_)({{S29h-!mew3~G@q{Fx zmM)9sXc%n%|HS=`-v2Dq0%yF;N2i&m{bpuYt-iJEDk7=mg>CZ}TPW$JNoLSHu}L8q zN|`f32~U4`*%d6-wEf1tC>6;E{pNqkrgkJVk-e>N`i37Co}(_^80tpVO_jcvAdN46 zYg*;wIWjjCDNCT{rZJbd!n)%_f=eOv!Z&RjqnM1S4ndUr7A=V}G11lAuVD2%*56br z2(beGRsQUEovot7k<>hbMO@|iE)=(>CGtY5x3nMgiteh1dwO|o2Z z#12^uPf5+6fA9RWi0L>&Q^?+}?F132vfH@^g6@bE?Qf;JnQmzE{aD%LCBc&L&_Fs3cKRws&=FmsE!igjHvib{{5YmTrvoA*4peoKm}m z)1eVhzWYEGYO0<=ul`9DchkyQ+AC<&k1W@+-_72_YUDJpm+|S#PMnuli|&s&_1S^F zQ`U}Zg6(bSzj)gTqlG;v9!l-a{M?%=%=hx`KJLCiPQ?=;wdrkb*6JQfo6mx^1!YRq>n$HcCG10R0=sGu`g2 zX4zdp9rxcWEBd@a^P-#O`LuL`g}_Y_}* z!6xE-_l*D8V$V(Ozdu@i&evq!G<%&My5SKSADl4~>2<0{)uzR7au(=mjvZ`2-G9MC z+~Qr98EvF3sGfC$m%JC}*7V3Th+;QQXqrbKZ=y@R>Arp~5YsteWMMbo$Aa5VdbBoP z)Tq1E`oyzEgKgVba@={8YBQr!XS$hH>XG|=S-wXchPuv}nwqq`mEj5JL-rVBNO@8& z<7+23(|{B~l-lC}F6`xuX^XyDeI$fmDi+sYv2NP9$#lSMg|cBqR)lv^Ma*V>_epDB zQ&FOp+I-FWM&{A0X?KLkM*^%a#{`73l=Upz-%Y@C^gu<2;v**149dR_<#)B0MHu30 zEGBh8MW=dE@Jmz=sSZWICtk~a1JxP7!|t-a4k{;ChXinWNq~y`HE3uFQ8ZTv`J6opN~Y?Qjhq?N7O)Yp)$$N%AFr3r*2(IJZAf=cyef zIM%ZZ3hBD~;$p0z+Z{fz#$D@>b;xk9V`k-|0fa|s^2OFmCimtcL~da-z|C5o=K_uo zYLk7HdeR%XLLB*iVcQk!wLQOr{sY$}fHJTUep@uB%yUNGh{DCn-b`2U2k~>vjQPv2 z&p4YPDQCGP&CTq|M~#sbN6sfTs{I%p&=n=(-s2Vcmnh`|Q60N=PVb_*wC?hONl(WL za5n@|loZ>uJdb8XkM_iENf@HVdf+gW0ra7wgOu}MlOYMAZ=dkaMzZUx^wAORh zU~qDX_FLzh!J1p%eX8GQ?tHH0WWbY*D2nI8QcG%EcCV<`f}s#e7TusUQ|&fJ5v<|7 z+i+Y%T)9L+;(cur?-Cs|55-rg^#-`@s@z!7Iwj;k&Zygz@o4NcxYcSOopQ4v^asK# zz*`2bNeB~y!ofu3yx3Fw!%Ehka{I@Fey&gKs1d2ZZ`KYTr+*|VmHQ9+-23ol3%{Jt z+twkKH;0{nE_9hYeAw8};f&Pjz*@EVG#g>6Zq+OY0TmyGETI9y_1$^*ZIga7txJ?> z%{jR?v&1H9B9m-A$mJcX!Hw906C>*==bS{Q>cNt{R6gyt`vYwWgvQnWxUJl2j2wL< z1WPQeSn%>k4`zib!FtNPDBGkizjCyhm-d3vS?n8ExruSJJaE^Z=C91+@I4{g#Aeit zzeP!mqqE|Ny6ABm1bX+ZJ~a6K=c5=)+xHQ!KWjW!(kFxGhQ_f%8Q%^KJrJ$xh}dLQ z{8jzAB}o`6!N#v`*6e|*W$ zNvcSYuVjtAD#?8iyW9m%rd_EhTToZfp1x_EnY1%Q#!uLPZa<=8P~dTp_);e5FeahPm8O1`d_P~ng(r~T1S*2 zSZu)JZbUMbIh#E+%sZu=-7!vGS^=*a+*0!KY_4bx*lUcfggy1g#3HH(rE^>SO7dleGzRLqms@IV5PIqR@s~h27P%cX-4Y|)o#tG0S zjPA`TS5VRR*)7|}>-PK_4!dwvcm}~~&U@Q+$9FriKC97QTQg;Rc5Z|@P;K6*7PS}> zFq1k!I1F-d;wv&5x%D_JGr(3O#s6yt|8mDnplny*0hTev_4a(B?174WIHKQ4UGl50 zOx$&f36~{9W~ljKqHciKcAHNZ93Ecz*oq%f$e%8NlI?i{d-Q2PO{eN`aiO$Ej=f~f zreo=@3@LzPbdEA#Q#0w{+WsYl9||GN2}1joQ8Tk Ra(*fTCPtC$*7*m8EzB@fX&Ix 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

Xmah5-SUJj7MC{wsuBGAGNo#@Zq z*n}!4ENZ#&)@Q_YCA4w9;lZ@`u+%994)58Zn*HK~LBGz@=Faqz{avczk0gTrSp5=N z<@M?E1DCXo!mEDn$cxNLi{Dx-ZaTg)Uh-=i0W>6#w&m5$oSsT3Dg1!owjZlO<-bsc zXS1rGw6@>v`c7F6F>sK4Buf@_mRil^gKjfgV4ff^T)=C|xc=!)u}VM-I1>NK|5C+) zcCAsQPcA|(qbEvuOI+A4$n-&Wt!XfkJEPkwE!FWu;`msQ2^w96V{)^j9$A7tV_KkW z@S6K-OjwV0Ut2qB3Q3JjnqO{h=P7m6-%aYNd4nN!wmA%M93sLNm18HnJuB!Do#xHr z(@u(v=w8jBhU3g^n3c|5n+|4i=rCp+nOj`!$qV2+mhD>%ZD-Otz!2Un$N1k(gAm*3 zv<%o_?bF+g$&a$x?f?jdyMa|J?8tPy;=!V8_9+RDSmh;7V*B!L{3)t8u|4p%i$|;Z zm6>6GZ}ZB}*V0DV&N->W9j<)`Agsbi%LU`x4&s7?f9hHNA}P147G7%daqO)ymssw` z#5SXca|-MAlcXM2p<(5Jd%Z~UzP23jhb31F5!`pIgcPK)##tDYPyogJI=`Y#C}GAU zF-Ioqzd45EC3?!(j`d5ug*fohh;0jQu0jpjX^>WNtwD!-OS#FbF>AM)DY1E@>^4SJQ;*>)f!^Z{m@YJJ^hf?hq_kL6t)N+! zG6r7KaJznIO*JHl4Fr+cVb&VICZ&IvZx(GT;K665<%dXqwn4WxKFAUF3!k8Yjt3&b zcppR5S?~0BSfsyaBeK~0bF8V~cNM=1JJFZM7;;V+MP<vMkgqxmKf$p|lx{GnBr_js6B zh5)Qc>6B@~u0{NXz_smcYFc0WUPGiNk@3Kv@32V;$c+2u#-YL$6H6J1YEO&kab^5NTJU|WZsq+Oo zRE5sg&uKsTTwZ8Y7JBlFDFhf99fz^IoiE**cw!S~aFv7ie4?aDxE@A?%EL2h(04b@ yR3Z*e2<;9K4}Bn;q63Xj*$2(|KaHS3-W0o7%J_EHH#P(ihMf)4nsmzZ&i??3XOaT| diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png index 24c5a50cc8a8300ee04355265af862e75cdf55ff..ed1544e09c13b1b3cdf6cbc6c8f64248f30f32a1 100644 GIT binary patch delta 4539 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 delta 4585 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_192.png index 5e26124fbd0703738c3b65e9c70e47be843e56de..aa0e410b4f579fb3b19d0c0a8987ee908cb122dd 100644 GIT binary patch literal 8561 zcmeI&S5#Bo_9*ZjkRk}!DAMfmNf8j~2CyK~1!q}l-@lnVgvZ1pafMn*>ZOeY&Z9jcs}nc?&dND^PP zAxkcD2FW&8`X%3a36Iv}{Ip%bGrYd;bKa?N(p`hnqXkrtl|lJn)8#uhq%&Rq7i$2Z zX7C0v^rJ+4>9xmY#-z}=M$cmMl^>$NQm@H@`R+bf)8L zJ+~@iW+&@uK$t!ue>#qnQZE1_iR#paRWgS}?yK+rByR@%>AOpqCx6+~FaT(3CvXNo zx*Oh)XQwR{tpDmC@@|)1)ziCKPIdO0asbqYR~;AsER-WM18g6{p94NZ+5%Pug_YK{ zc!oz=UMWJ+C4J|E6Wvu#0za<3x7E#@_!44MXLq2Ga#i)M#{mwwjtV|9{Cz^jOrcZX zdig-5g@}=y58_|b7l`oLVas50c2desu@6nN^X?;IxfrM*-)7AgS{)yj21%`fL#>1# zy;l9@4IN&Py3#jOU3-_=1?n^t!VL>Xwf4No6Px&$09*53J*63YR{po7Qc!)N|xgc^hKCeUrh!1%YZx(V}TH!8=nJ5tKRkB9>n0DKZT@~&erqA zyD#dlyg1T2&3iTINkj@^ClQP4K#?O~^FQFf++a+)Zlm7(X#Gyhr$gzEz1NVJ6ukF9y_S zeS%Fn&B;iM`CQR@>nQEejxOd2I$I(ivGU=Nthfd4X33%H zbo(u$U`E=5YurMqs)voe{LuRG`b)C_8YE%MV!^|-zc?SPb-ccso zF>2p^iK#8QzP{nburlZm#jobpviZwIC%KC z*JJ00Rk?-bny$oFZ=Gc;8xAM#j#0AIh4Bm8MzXK9*>AqdS)XskuD5}Mwp524q^uVb z53f$Th?GZ^rK)Mh5p)&~7%N7RGb^#&+^RQ;yCsPb)U6tm{iSCl$zFe%rfLgj=#Egx z?TGZ!Q(&co4wND~wes?GNTK# z9hWh6Jc-}2n(hQGR#1z+sz0|rRTQNh6biNSG_e?zo^c6^b@Rg7`Qp1TJy6^sG>xCs zQbpn00>{k46%w?xad3;#q2oLO~iya|2g57-{TEESg zc&D8Gh|4IFS}BY-7{QN}dmNjncI0bB+iVPtMF*rAp+Gmp^|4iQx zDKB8VrvZEZmecqf+lS@EV@$?zODg4@80o$)BG4^3=~8>o?Vb@0%&KI$*|@xHtq_ zMqh&!n@?T_qi>RHZQf!HQjML*28QlYc%VllpYL?Q5^B8FXc2;yU#1=WbR{G|WhF`8 z$sy0J#wo7r3dbR-m^)h0J(`Jn9Lvc>#F4nPcW1VX)~?O>23AEFhf34;sc)`u>-?C$ zDqz*rmIzsX>sQpONFfL&^XByGrDYBspU4`v!W#nHhQ#r7?{4Kx0fSx=MCrz_Fvpnw znM;lYJvt8*TE~6ABE+k%qGLk}5f~%7n+s|$JUG`KuvN7#XxO7n903Pigp+AbCe`5g zA&p-Q^@iEMDTB~Nuil~$gSm=mEvUXV&^n-NGmCSLFR~wZ;Ra9^IFT-t63ojR1q+s5lXQ7^on!iIO}@3|0!g#@Xq}vw&25{gp?_IVs5KoR+-Q&_>gRS z5S%n_m%S-SL~z?Qd>I1A=(-TX)`0d)(BJ21lP(!}hdfQ>=fgG)Jq$%dI?t@vAz8!BkR;2qVN%CEx44)kc`G*>z+QwlpZ=`a zJsOA{>DT3sJj74xSLfbf$zWEhdtiMO{2#E)K zw95j!s3?xwCkBu%YhXWz*JkF@ZM<1;%8Hp;W7k)X;G*wWT8abu-rC%Z3gn(Qbx!lY6I$Q z4?M^zhmbEHCN+2ITW4#lrn{XD*Evo*(0mPiOPST1$DEHkJCS`{u=sZSlMA4H-VTRn zne*sYj)Zgxa|*W`I0pDu9F4R*{kjdK@4Riy=v;8%;c@SN_Hsr-s! zVt6#ASUg5M1NioQQqkt=P|AqO{87XaS_C!b{9zzzV(lD;BEHW6AB45`dsVJ4#STyu z4orzYrcf~+Bs5YTt&H^$KX>)CZ&W)7R}%Qj3HLI z_;`JUC3?NrbkO9E^rJ_C{O`1^V#OSO(eAS81TpmwG`7ZC&5~$A;H|Wdg=D=+^)un& zfbhi9F6+KLbLkxE@%o5-!fLGOtV(N6W8<0x3UNe!{2xGpegd~yzgU?Do{~|31=w~Otj~r1L^zAscmAPuDFXnC zDG@FB+O|Icql@c2eSC18h-p1OJ69fCS@wzn0-PCk&0U$^*Y3k)-i@I%Y`n5jm^Q~p z>9mNQ1Uo=Sm^rCilNnslC6(Rm++c3y>=8qrYWn5o<6WKm;SkVj_p*6h{8YI2&w+|g zSYn2cAEWiz6;9YH3Qg~s!S$9(2m!%yt2frt6g`_(3O=QZ@H)NW6itL=M)yX%)OcuW znx2v$#sLIr1S`M`JmrJfH5*}6&uP2f`wyJ4O5WHXKEJm}`lDMj*q$3eu)(m=+Syyr zcM1bW5jXlgPM^+5JC)p@;KNzmYQY0kEaXQ~M+{{=Oejkx%+RaVS8L^9xxwd`->)sp zrZK-x3-qoE07p^Kg1*M55Z!L?m%dJWj0p<3!4+ynmH<+7n#TLpc!BE$!Ix;e&FfpE z6}7Vqe`qjQQVC_=zIX7|Xxl=U>iu;JD{eQ%6PsD3go0<&V-1JZp@OTfB#(x8xWl&l zeiA!TEa$L|lbNE-?N)l0 zUUAA$R6%uQ=V&0{cEgLf8=tigj1^DN-mB^+jQp z>c1^1F`H5YJTo95-@=H))0~yt@)|P9C%n<$FWe*v4%PQNngO#nnnBAl3{2zxm*rcn zsLGtyOtkYY(*>S1EHLXgGMyrPmA+T2yZN>xCv{2b1U#n$<}>k?F^MGNsu_N z!#2RT7hEu1!Z}#wy(ZflDcEHvkWREDV#Nqb@+b+b^qnAL0;jJ68yj%O65gzvvb0=a zp6<^9kn0{wV#4NnN8J@X#I?LO>NtXVrhq_)MGv&KP_U#MI`z>SNZcy-`wNWqP3Q+YREb!OvvJ>6Z8Vp+gEjr+}D2 zH&!t(cJ9mHMEmWzx3oatfn2q>p7Y%JB8%hTP3a^>c zHa=Ug<0XK^+Z?>WnG7BwKt}=e_ZN}_IBG;>1Gq0iLBOHC#SKBaKqv29Svxjc0CBm9 za-%HCaLP9rp?zEDWwg7fBwad^UTyk=yg1q2J4n{3Q)mipxbCgl36>Pkzbg#||9Q^r z@yT1W{gzk#t~i?-{J=<~?xw}^Q=NK{C&K|w8EGEMp4eY{yu@pAzN;`>JC0g6F?TxB zh)sBu-^LVtuvV~osR=Ab5A@VNAX6)=c?kqCxG{f5%50}{F=)-pNsm))RSi0|Pfwom zUpQUZ8__|{u-+{(|0o{~qczadYd$atbg}hjd7D`kc^;dD%E}YRG(2L3#%H$n%kqW; zn;0(H9}UZ4sxs4lpG$iZYHIru0{H(7F6f(Q~>KcLAUMnvf(`K=fa_}H>-`CqnT5aR-+ z7B5cx1|P#~@QwX%xuS;MQ^7pwZrgTx~M;F_0 z-A&)oQ@`OZ*>46!a>Ndr%G$xBU6L^kZ3xojs-%xk;?yF`m8HC`D8XV1l`p2#RWQkL z!u~pg4SKgS=vbM=v{G>NZ9P*mkDW+{76OeE4tMh_M48ijVKyP zo9q`R;X58SQG3(dmIbWUN>$)v!nWc|tv)IpM;%f5QI#~Qy*Q%3d-BAzq~wl^WD~53 zsaFC?>sa;m@7sTr5LvxXqw%d;b%SGKvwH|k)e-g6eU^AJaF@Kux}c_~wlFXIMO4jhew;IfWZ_q*x_A8< zOt3T-94=g|9bL$^dwaEiIy7q+-f+o3{iTbh)bHPym!h@oP4~uYADh^$?8ou?nDMXg zx&gZ84$n*g zcacr`&a6JAtw?)Oyn%e}mDg71-*yd|98pGmO#wwb;jE=mlm0E#ePwm&V`FzYEEl-u#$vDF(7V-2Ojf(fDmm@dyZpJTvu?{%zGp#4U>itkK;4^4 zH|~V?!~slK>ct}P9v!&RMT!@97QSF z-PZK_l=G3+1Moy+>+S}r&u^8ui2;dd#t7^~u$p0TXW#O#g*KsgsMN?pgOR{s)mzTq z&&m3?6JXO_Vcbsn{S}6-c>aRl#PgG4xM3Ni#O?7F6NBU< znv;qkG>1S0kn1lpgs$fnJ{~>8=o@?4Snf>r;z6?Kb+Ix)>%C^@e`wnx!$yvO z;mXNE@gw+EeC>vZRp0o@e!%f2N5X@t>uI+r(SA!b5E6FSCUK>wSe)P5&4Uw3JBkyT zAuBF#yzirmape243HkU1BtKY4h2K=+()qyx@lPg1pH{UD=TcAsC5(jlZqgEl1#~?B z2bG_|NUXM%HAV-6|oARa`9`W}R4%q%W+BaWIiT(!Ekc8xbm~_aVRzwQ3 zpbhDnzd+%c&9%Vg8%131j^&-LJS3}jUIHJ60US+;Q2>FUWdQ8Iw{&Z15dWSC=&Z-H zr|X|&zgU+kZVvpizCr8~pO88AuJr!fr*mpwn_AOS2DvLKoSGLz{C(aB2oy zw?1|p1=?Q;;*MvYVRUUL%usxUnGidVRqrDdvmLc{HasVD;o@U8L((lV=TM@ZH- z@Gc6j_<}X`9|3>$|0n(>lC>eGE+a;_;)KAivio8=hSro3!WPSkd**_e(eDG@hL9rG zqxn3s8h=$Bg%s?MCn&*&iqO=O;c4H$%C2{KCLEyMi0e?;;fv79Ydk~U+tb`{K7_pT z^JOy+<|XEQi{a}VD~gkQLt-pNU-Pa{z!kzbXw^&fm}n|I&4hdp&wSp@y5;}y{E=K< za9ZX{n^65xwOwgf8PC?g$nNwLe$Zp|F>T8H13#(D$eQY-0#-mjnFn-=9}%TJl7;)0 zw(|O^`-y4_GVn$AnGeo_z_ssr+gPRLb7sbS8ad$yQvv=paGhOPot&s37cgjNh3f&I zm#-SXrlTz5>Vrk-#Yx@*W;wZBa4NTmgTaxo9mfV6yND7I7wGV`aTcX(ay_y|l@FNA zUx7SJ4M=*}W%E=KJz#DXDll?>W@KFvZVBjQ^S478ZxUzqM?MQRpNsUhB(URmc5uHO zXqzw)^6MQAbh(^>zKc5A3tyKyiY9GN_eS{fvYH5itjcX*DW~zXeO|BYN6FT-1%i^8XsbyI*n;@8?6D>hr5@9QVCD5EJ!Z1V0j)pqrj56-pQnht%pbVK69~ZRMRW00nY-1aRPnPcdeqsWLdUC%fPp+sMt?~ zgE{>}x%_fQ4y5;s0jhd6SO!xrQVL-< zj)zz%i*LRF>FC9~KA9oe=tj>hes+g9lYg(PX9t(4u5MQiPhsPzK85IQ7p}itJl5fY z8&>f&%eusm6nMYdTCeEc8p`ZXo^ zzAxC+?mpFcV#6cf3iSf zlA(*0vmKid>jQrZ>BGK&$i2Y|t;PLq*L}5o#NXrgGWsaV6>=bHfWykr^FxQ8lI<=8DZtQ|&mBpOqzWO;0xU_SV1OGb4%4GT4Yj4Q`v%xxLP-O2g1~ zQJ{U`J~1@TP%4rO@IC`oE}>0a0L_vQ$pT2IfVMOj0KLw7=l`o?Pv8I`iiLlm`CqgD zJMF&#`5&E*|GxrKMyzvX9So5DdluloAN>Ez*51>`hF~1&Py8ZSM=1b(U6b2oH=$Ag E3#j4H@Bjb+ literal 8629 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_255.png index 743e98aa7c7f729054a16d14d4ae26f2f6b1166a..46f3f5bbca25ea28d6406893c5986b1c491205e3 100644 GIT binary patch literal 8008 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 p`+uZpFw7=+pp}yIz8a+tde*wjisY3t& diff --git a/tests/ref_imgs/draw/render/i1/demo_render_line_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_line_opa_192.png index 7b95fae3803900caa363ed073c05cc0eae90c1ef..fe506e2fa5da3fde05d1f5cdf1b275d444a75ed9 100644 GIT binary patch literal 2247 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ14o~yi(^Q|oVV8waxy3g z955*TKli*USCfkHmz%c6+zbupDrFfMK1esSG6)z)FfbU7GDZVoG$oAYg3(+snhQpA h!Dud^YA)EwU6#eRmv^4+GhhRS!PC{xWt~$(69D@^T0{T< literal 2252 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ1IJ`f7srr_Id89R%7xv&%9(|Xz2f5!oYCgzJv}#!;FJW3>}iAjL|?CO$np9 oU^Ewu=7P~&Fq#XfnhSC*df4_pRoI~dY^5-Gy85}Sb4q9e0G_I!t^fc4 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_line_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_line_opa_255.png index 7b95fae3803900caa363ed073c05cc0eae90c1ef..fe506e2fa5da3fde05d1f5cdf1b275d444a75ed9 100644 GIT binary patch literal 2247 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ14o~yi(^Q|oVV8waxy3g z955*TKli*USCfkHmz%c6+zbupDrFfMK1esSG6)z)FfbU7GDZVoG$oAYg3(+snhQpA h!Dud^YA)EwU6#eRmv^4+GhhRS!PC{xWt~$(69D@^T0{T< literal 2252 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ1IJ`f7srr_Id89R%7xv&%9(|Xz2f5!oYCgzJv}#!;FJW3>}iAjL|?CO$np9 oU^Ewu=7P~&Fq#XfnhSC*df4_pRoI~dY^5-Gy85}Sb4q9e0G_I!t^fc4 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_192.png index 75907937d383786c3afb0b6c374b73a8d57751a8..0f0dcd55c6631c83497870bd26a1ef46da722e08 100644 GIT binary patch literal 4173 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 Ix)+o4Z_vszf&c&j literal 4194 zcmeHLX;hQv5`IH~gdMajLRqb)YGkP(2qahvf`A}`5W^OadMr{43Xw&YL_{h9k<+U| zl%-e!Nr+L4KoAm8Tu?y8fP#>SEJ6s2$dZJ>{gT{z>^b+gy?^?v|MJc^-(+Uq=b2}c zGrRmeHB=2%0RS31yxeyK05<~w#zQJVmgfhH%K*?`zr+2Tpv239{%04;ylzM zX}hfE=ls2`PHrSt=SfnHb9E5%$lJI#bacOyL+9+PEC8lmm*eJP0OV}P!@wyO6d>A= zlz{e^3;OPwMq#U5i!Yl8waiT)GIJ-aft}+TXXpYMLWP!{+>j!{`{-*P`Xf>t? zEUw?b(aGfNe-Zyck-FdC)S)7(a5PDx(IrTjx5n6(EIz6s2d0UhvLvxFQ={{oN98WV ztrDqWS8M*{sk2BFCayWJLf>UL^gGMtnnm+)sPaf{?0y_eiM8}& zz2w0_T8j1Djhd15Q!Z8h#S_e-Qg^=pRJoR>WS&$jeh;&t_Vx$Hwck=MF8FxS z6eJ9^_zt0V}=yed(`8V0q661x_zqm54J)RPwQuhZuAj7KYa%c_7Bs zkqzR$GfqxH#Qa4~Jr3s@wIQld)r3>XRB$A-%jko~fx?$RjH~j36v$=SqmRqT8AE}^ z!KFp)va++s>k6|Dr_9wv71B(e`r!lo+7G2o&(UIh#vK_hU18keU6qvsFZ@4+vf$A!(_Q)|ypg^8ozX~X?{n&xuVcqv* zpZ8&~dhm>(^jx@&Vz?`$yuo17} zeFlD%yOQ0Q#ek4H4Gu`0#X$4@d*(o@XBd}xbhWE}XIx%1oemP?$5guea_>ASN(23^ z-U$eG_Vw_CCkYG3?B?pe8AwlCL3GjH66_xA4gs|Ajf~}9wVo3~CfyOMpF2DZWBX8= z-0Lb?7q2(x0CY`QeO-HR||U&>F+zI3|6UzqT2_jlikHDcx;eYxyMuU#~{C4u&O~&fm@c}_IOk7S6Rykx7 z%_P>6QCUf5;?%q3=V^Bc_MU_qgVGy05fFUwJMjTN351$=wemC1T7m55R895B%RTtv zdCNG=NKr2=|Cx^(6>(=Bqq2-Y!zrVfUyvCl%o#j4c@$R&@9>=KdgrsS+pVFmoz@{K zz1^HFrGhmQWpG*MpW=ycX2|?YGueYFcT-@|0YlO97oK|Io4=DiGjqc??~;G=z&D#I z8#JO8(!En;Olw9$$IFX*T&Re9DyVmTHdiRz{*`(y^t3F|oKkLkgPSSj>IV@{)PHB= zJrW0==8lJT$^!DfWDqT7`7yMy>=k)_o(gJp{W%f6STyep`y^Fvq(D^{%937!lJHp5 z2#o>u7E-HlBx&AMd@8v`OB&a4j<8 zgoJLgt1Z0)L*(LEkuj_cZj9uEzRLIy2qy`#A_^B#GV7Aii^!{(CX2b(x;SuE!^04# z?T++rt-?PhSZ0F+!#?#zv=!GW5y9STT~5d-XdLr7{d%D>n6?GtgDU-yGn}l zMf~7wP6niS%%k3|y~25hH^d|L9r$M?CwR-Sm+B8BB`pQ!Odz!i>sT&I1&5MFu}QPS_d$>jmE<=iN&us7QjxmQ__-!e<{EOmpN)I6 zLYODTHV~TNGL6(AoS7aTZ55bWtuO`*9WcrCn6K5<#^cc(U67|-g0HR}M_*dFACsDp zmGVmic5ITEAnz2}NJg%5CaVU$JS3PnED5!aN#1ICCBQQdWn>AW;mX~8{8VSjTxi}x zOq`_1%J8uoAX1cB?p{6FqdqftqlaW!sXI2~LL;9=3#%Wj2%j0h&nyhVqsPGaMq3$^ zJp~YNYIpoP6Uyy37mOdcFltCdZ`Y*tQKx1mUYR+h@f)1K7>v4>H&IPRKaLoZszXD6 zhpCF)`w=A&^wwwcKg;%C$Mh!v_^)gGKarr-@9!Tq|6I$T{-FHlTK;ZiPOJc~Z=9FG Tz|a!(-vQX+;pa|w!=L;&hrlT* diff --git a/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_255.png index 9314b4cd62dc7f639187405c7538f4e2e2dc16f2..42345a5c555fe0b168689152aaad7a767f5494be 100644 GIT binary patch literal 4568 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 W^vIl_?+pDp0Kefq_A~d9lKu@jb{o(D diff --git a/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_192.png index d5437fd2b52f0f184d27fc72723923ec7891948b..4ac902bbf9e1712d1ffb2147b128a6b67295606d 100644 GIT binary patch delta 3429 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 uktb%HAPdc%ja@P|mqjLc(V~pS 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 delta 4109 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 VxC@cHH~%RE=WOk5h`;z={~O=_cH;m5 literal 5783 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_text_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_text_opa_255.png index 913d65a4567dc1d958467b86271ea166ff73d20d..ca7497bd66ddb151f11dd72e04a67bae0d64fd8c 100644 GIT binary patch literal 5754 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 VxC@cHH~%RE=WOk5h`;z={~O=_cH;m5 literal 5783 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 diff --git a/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_192.png index 26d4fc46bfb6db686ac4572df427a3c67c385137..3b0ba64e4bbbcd695a270fcaac7ed2bfa0eba9b8 100644 GIT binary patch literal 2940 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A1QfZHI&TpJ1GlrMi(^Q|oVRyx``wNb zak%(w#sB}O?f5-7T8lV+-gg@xOV)l7HF2}8s8f}7-(!9ThPnUKfMkIw6E}l`+6D%O zq*2Cz2SUC5|JS$Qe%t)MTITrqeIHb&M?P8GKTXQ`^PPIz?f5;PuK0 z_Cb{+fM9 zUG1Flm8;z^kN^F`C{!N3W^+i9>iQ2QJA!7#WQsrFQLgJQICXO0p|>eZI@9;w=84~x z)fZE$|KK}YtJ~PfO>Pe&f=Arg^?Q-D5)f4Z(^lJI)`JD%)Y7 z9=lhf=G5+$A3D=d_od$!|8eJRCj-NUPoD1>7z`U(83cqQ=)%~z|77{jyLsjHMKbQ6 z=C)VHCeA(iy(&b!hGGBvzs|Mk2bZ3)Io4;)tep{eu&Vw@O{Lb_XQi#KYT@C^wRYcT zdC#oukxgd{oA9^egGJx&&1n;Ze(o!kdY#wsz5i`c+4|Mz-|m<)^Z1Rzw1gQyY$M7w z4fck}Z9UZa^P6L|&DwjnQqT3jvDgn$uq*i9le)%ZvrNCm#`?~DsHo4JZ}@8Zz5I>; z;?m@jkI!t}dG43)q3!y6GuGr+{ocGyx9`37)vMLk?^2%`md%lrcyp&e^FqY^?RTwb z>P3cIuS*6C&v^0W{K2YP!?erCq#m1weX~09ebzTc>vd@mP4CStl($*W2I^;+;cd&n zaO6+8C0zoZo{>C^?E3xtXZ-!V?elBzKenj*)~deqj8cB>mMb%6KL7W6=hy2$KbrnY z{~^}jx9eQ{p&TG!z&E^E8}dOn`{pE9awy< zmhakz!+$MbzdHIL_?~a8zfE+R&Fy^$p6B_oFf>f_FJfot;M8Ggm~ntgTe~DWM4f4Ck6E delta 924 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 N;OXwYx6&1x_9sSJHvj+t delta 1602 zcmZuxdo(SKAvTpGx)rj}nTHDQ7w~pA9cs5h4STrRhk)eiSX-!m@ zZE0C2B5F+u$5sCR3wb+v4Ha!tjQ zhc3!b4qd1S$mp;TXhw1J=T{5gOT8I$*wkgw;8<*ej8{sO1T!qeM{zkx73_%k5@bZu zU#^~_^K!e~YZfn-Qre%?;bLzE*X)@#$FA9RNZ|;aQE~ES5V;4JGvJY+*>uYXvz~y$ z3;BG$H%X504^(vTmtsyWg+xtEo~u2G8Hm7r1XVU2IkaI?M)$LCQTinkXW5u^X@{7G1wF|xMz$^|wULNk{_$(BcGno3|g{SiGq#5UhpStWD zEA1OIqli4?MM=6X1i+Ts(&r7F=xPJoSJ*`!9%mV0yQb3DRnfc@pZM<(**;y~bV=4{ z)+9*h{P_18ngKjvI!CvYSg=#d47d{}>TdY0`i>*Yy_Nsxz>B6K-^+}(18Ip~M%2{+ z882tpv-ooVP{RNgVW?iaeY$^z&;LsClc>F{$fJ87RH-E$r*?lh)fP5fwGjQ=J@UZc zclT%HCMq@)$9jc~34ML(P9&bq>e>1@yilZa9-(bSr zg-+?A*c|3f&X(umtE3&3P}Za2r;Yc0-OsNk+IcL*DMW77x|`3rC*tGgCY{3)ofjhp zavum;j0*^hGX>T~1wq}Nnc|CSZC@%xfZH_?3S3+_cc3rA_K>&s`T>o~W~Q9KR5sRv zS?<@6F>Dba1qsVxgu{dCK}TZILc6-%-&}(|wN3ly|8HGw69uQWonz zDi8+&g!)!Bqbc?^ zivUVj8oW(bJ9GvbQzS5yy6C}_V(1`5#ppZ+2f8C&Igc%Y^DxvU^z0#g?CHDOPo^*T zJ>1sLE@&}r=dbnkI`&l01MR;y*(R6kK2Ez=p=+vplj|jF;d_@BxwdWV5laX2hTIp8 zleWcM>BRLaNihQ>j8Q}fvIR>j+NkpKUU;QudsH20Zeb*JB#FdiY*_au+g80)IP@ba^%w@b*A(RrNyJA7*w>{gQ?4@T} zLf#$lmu(q`p=hfHD2UgvYwF$NG~kI5sYtaqI!zDA#gY74VxU0Sq#@lw?=ZdG$oPL? zLSCDN{Gd#4-Fya5l}SUEKCHvs&t}>uF&SkqWEo1tOz*-(KpRuh#^Nl$L7pZd^Hy60 z{5dq7Hu_2TH&&4f(@VmBUW)DF4-9u?O%bSh{6<9c{oSFr9{&-YRJFjzYwsmyiXT+B5wt>oF$ORghY=Y(gLq)cgPvMOgSLJL8w9 z*V?;!CxX9BuWbga^`&uz$&dw-Y-YJQbhZk&}44vN1RJCg4c@A} l`rn`41n%EP1-NY8q=gzHQ^Ss0&>8@pod^m!$~lb7`v-|&Djom; diff --git a/tests/ref_imgs/widgets/label_scroll_13.png b/tests/ref_imgs/widgets/label_scroll_13.png index f8a2c82faff7ec978b916c9cfbf4b9da7b8dc70d..afad03aa229a6ad68cd220429e3cb33baccef599 100644 GIT binary patch delta 2377 zcmZWqX;f2Z8V{J5B{fq*4h>AZe?>@rY155VkDP7EqQ%maJl~HZ#o} z5K)=NCB&%I$&`=;j4_r-qRoleLf~K;5iS9hO^gX^Adqdo_V0YZ?m73p&->l?S>EQI zKkPjJx3aRshd#?>HQOwSRhx2Kx(ki6n9axh_C#Lq-tcGg=@UoWzKp}{=w7$&Not&IVq;UFSxUvTt3)&vl1f#yS!%{8l5T(tlR0ZTm%6>seDF z5uf(?+;27@5Ki@9n*26IL6$x3C=}{i0{ixz4%jA_%hM#LRe`yzSuE~fiNoQ@@vQ`@ zOrfAvR76nY@OW_u>%@r@?B4P5af4?z=8gLxY1NPROnZz*Q^2-;6(hsLocWiA+Vh5R z3Wb7?kIzdmywu^?3loO=Ac;hBDZNIr6&JERRlgpg<@=&WX4{oYfnZgh%;#Ov9odQ%^}RfkeQtT~k1h&@A}Fatsf4N- z3=H)19p_A^#Xc~Qp&O&A@)oz-nR=S`IN|}bN*tXtJw08NOQli?FRH+i=wTZpSForK z!E?*iaJm?`y&-vVKD6nu#^Md#=t{hkC(DyzuB6K0!m={yP&o?8du@A*7K@nUo!Z&n zN>5ny&4lwFUbj%Q7r%h|uO(VnT+H~Q?_;w*Y8Hu%#Y%>TG?}4#@M_`EXgMaI_;n52 zX!3mL$!)#ES$Z|#?*a|xS;Q{wn7@KL%!>>}+*8ute#%FO;A)-iu`-M(4G=IjRqSAt zm6b(ZA^sHRif>4639Ebk@X3kTa#dbK^4Ap=GO{9jYYNmd@TB@boGx$SL+hYor{2pl z%`7b~)s&P-hRR2)y!O$U`<=(pokYZQvbF;$<-8pwE|Qu{^)K29(u(r(y>`r&jrKbu z64T6^+1bHTmCn0nU0s|uKPrt^m`h1<7nnl+{*^7uFLoqymL_{H-D+t1<%g^5+x8}= zmV!w`@5~JD?zx@!*mr)b{ZD}icL0+-;q`i4WQ95h9TXG zHsW8-Nx&iA6^uZ5v)mD%D{s7u_Jh3DLJQD+l*qcT4g`~8hTUXK z?W3NRiRaIsgCNP?u?|s-SHIhq1c;_+YuR2m`;X~@&If`kDk^TF;;`7QjorrL>ey|g z32(k{x`*5jfzZlFeJPmi>+3TZlGHG1#5OnA&H+sBYWl@)r#kMwz5zr%WfU4b^)~^M zP$H6;d(NJL`q7p|4u^xG>547PRtz$kOaL><&l&W;cjQHIFx@TP%Hg1Tfd*`>j+ZAjD=h zop!lgNf~>WjsCn5Gf13mKZVt?`(?Xa^dDaXe~$N^p>w%f=iRGEg=rEre!}Bg=_1eSzt!vY zxA$H`>C%7-)i7;LOB(h~Ond_bNu`q6k2Mf;_Sf5PfcNBsl9Cd2+)QGs#B?c=0+xgv z?4gjkSFc`SMH>*#-F8e8i@~_t(J=t#W?ODaX?!$3?^>D7mp%1wBB~Q604zpGBA?F; zFcf@zuZl|bYLMTnR4N{iM^(FEnl5YXAP6|~{ckiDtzB9VjApKa{>$kiSNw<^diLxx z`b$BPYRM~HnVt$S#|Xp2!-3EnL-2AzGN5pY)5X={DQqOdy&CvWzD^o-?!n=|=vov&Qh=M?BiZ?(cKt<#{=bV4v=Y8Mj`F*d?!~LcEfBBs7 z{nuX|kEWJt6lmf;>5G@=XSy@0$(w%MeOSCX&FlK^vpatzgr7Mrui1J|u%8o~GIH|| z*_n8|KF=>FHh+HT`i_Z>-5>2}e+#b)ioB^0Zn=s|_e4%1XIzI=`5Wsk+n_H8Y*vLc z1TB&F7ky&y1LsC3xw*QwQ}xN0zHgEzVzKPVDudVM?B@3NQeEcNt536{xv}!m(NUQU zGk!HE=NNkF-Me=)zqz}+Gc9P+=qjVt_>q#IFIFmX;CorKKww-mF06jajO%P@xRRIG zPQBG5?4;@^jSEt>S{)Ge;o-heq-ld`2X)@G!6CYOCX=bBj;H%Gx+g-CZ{NOM<6O{{ zQl=pS_j@y) zzuna{DOWpKL~nSuwKZA@0*OErryd)u?THE~Id!vp!epWdRruQOi{ne|00(FV_J6P^ zp21+0MOJy-GV4@>whlZV&%^y3Ub(QauqqEL46l?Byo&!!^Cbu{u+=CXdKp>8r@rG> z=C9VP-mI?$`1{|g7#$mHX>R@veIB!(r68JDR#ujl>LmnGHdW~$v_0Mg;a_KtBqic- z#i?Tp#v1am;NaY$2@RzU_UvDk4-XGh+N{gd{a{2S>{Iegu7O|F<4-TkT zjg5`>MKei183&^!4UIu76o1qx(Eh%25(CGEN^T!aAp_9*NU-g`Gjg?{#EwV>#lqS{_fjU?fbX z`C@1T(L5>o5Y?s-8x<)rhxY#6W1t3*}WmFfed|KQ_dQkPrkF9$)~aQn|mk`mteVXO840 zA&7J(C|x}CaFolbesE+FRrQn-EVpI^pnFn$ z_7sMvo-1lJmO-zpZ5dbMQhc{hdHp>J(>3X`xFvM_u)g9KN}1bSv9OP>yAlLRdvz@ z?=Nuefk8nvFJ>c%RKLZZo}MY*7U*9qT7!BJHv2))I%h@r@h1N7+Z{K-mO(2V8WjVd>MXbSEYEiPCR3tuRDrMNEmN*gH~vWk89n>l*-Q5 zR+@1>hCfz%>Odv%)ZUDYj7N^Zpf0Rl(S=Na7J89e)V9qHE-ETI>3Fty8t`Z|UIY0x zu9=;ELObGOf1v2KR!cNC&i_v9*y#5bdTQ~z!oZeBT5xc1*qP|I7-tHZOs3Q6gK6gS zPoNc3@{MaC9uX|o?b{<#DaR{9q@QNEA`q0IvI-BS5VpO2PP48VB@)Tx{&HedE`<^c zZxv1E^iJu4YLc%h(66Sar$r};hA4no9gn9bk+k)`^q6#zwIDgWCzhsqS*$&pI~E91 zg{M1=^!0rMFza7F=mvuMTyZLJYVz#j;-cRDeq+Rk0kwvlrF(w~VV)-nWwV z1*)U3zVlKHRd~#xnp#^iilPdS2S*&XL+d+3*0*qA91mW{OO`9ytqLs?UKcMI!Q86O ze9L4H)2{p|YWbJBtRPp%+zy<&4jt%Xy@nWk6g5aHf|vN!kSIOn(7X$-`+w1IhnkqE{8jTV=i7)cXc7*%va>V zS_y&8W*aU)kq`oe%SVIZi}{YgaL$j{!mH>iS;?n!GxX-aJ|&dtp&-)1$l zT5_T1=x>*^>koN*JF8;(m(1v!Iq(0549%N0TbNP#pvd~3CIqb?0u7=d0{ZEfYTtwRZF%eaZfVhM*@pzAz$lh+H-c_1Gt zZ3<#jTx{&iDLsfa40j|E9dBGY@&5!8ZT&jzjQzF(Y?ZqBf|FD#b#inBkh0Jl@%c^- zu^e!Qr=D_+DG{HTfW>l(Pl%jLV+zt?B5}a(zp+WPy|cF1wzEYu06XwYvkJC>7RPWK zTU%v1vy+pP`rsgR-R7NqL(ter$;$F|u~&BH2eU;$RsHw8E!K^DNKi$@M5AOb%Vai# z2WNkY5vB^7AFZAL3D|6EYHETU=<3Kp?oC{a83cqA&lMkM3Vm7w|7ZN<>}+!v@?rc{ z!}j2^NdA~-|MGBEl%Wud#ipJkl1S*egGJDDm9}lL9Borb!3BmlY5Qyo|G53>t^6JK eHJf(ZwqCBT{cPZ&3y3WU`Z_G~tGa(A{qP?>%RXTM diff --git a/tests/ref_imgs/widgets/label_scroll_14.png b/tests/ref_imgs/widgets/label_scroll_14.png index 9619d5ab2f1a7bafab8cc5c3a216ceaae0ded0b7..589c11767336bf85dbb7a9618b630249ebb3bd93 100644 GIT binary patch literal 4804 zcmeI0YfxHe8plseqfJaqcWW{0MoBxf>NFxHhiC6y{hLZ~95aapUzSW6IzL8L~BAVEbyA;7-r?CwlI>`XrFm(Jw< zc+Pu&{{P?eob$I6=-3_Ge78XmwBy}BzjG3THt&I;O|vh%fhRv^Hn%{~Z!6z@=j}vl zqe1mHF_obHr$!cUy#Mi*J+RqM=&oCkVg0^&D%wA`W9XoHm*{GmV(xxMV^8p9+NRI8 zoPfP`G1IxD8h7pwUY9-*9j~$WxL@Cna20s@Ez2}FP14c25KjoocN*VkLr}jqCVdn1 z(biz-@_`SwK(7RJLeQO;V9;Bi^}9hYznTm|XWcxZJ#qi()JgIBmM&pXsq2)+5y?Na zmp)(*VW9p%oto~UUt0QBp?8$MiY%p*(eJgNz8LBYw+BPBjQb3vW$UsqJTlTg#epD~ z2)X7pDV0X^6c+`lVw_Q@%XUyDYWQ|{=0G}uz>#O0?G91&@!9 zi&RgBhliz7sZF^;?ZxhokB=`O)Z}*~!o!nMMO13IZ&jcDi6~n$Ffai2s5g}lo=vH( zikaImX+vom!oW)n>bYm?v zu?J7@h!H!{ZjkFstE(dKX7bgcIZa-2SqmkiDYZS!x60A6GQlFo^&#IIH>&ht~a@`{#ZHLPv2kGj&L%;|u`t74kagaffpR85n)LZDf=skT40T&f41z-VLLrgQQ{A`}JwL(*oSaxG)cOJCojqc%RZ*BcPh#x~FPfw~2 z((;^ahBIYL?4x9BAP^Fh$pkZi+XTWfZ8%6fj|Ppdmc!}c2*hsIklk({J6}*zQiAX& zkw`w#6N`myRi{Wj9TZ>l-|MzPrJYta6I0fblzHNtu+35HN0fR`Bk2O8ti-+`s2Tp! ziH}Z5bfvYQRx?}<87H2NC|>>Ee%9F5GoF|^7P$q>Q;0z8=}FyRCs!1!h?GP1aRD`8 ztNGv%`XFewwZzq*9o8W4Tdl0DTr8xK$spd%$THjaSLD^};K8L!m-6#ZdP|u{Nwsz?$)BbWCeP>%@&u9$zbHv&Utobi{&g z)6>)DI@(U0g2`E#On~}_%+FYdvK;dUegQ#pL>592`xeVo_mD!N0P+Z@b3=Vc=U0c| zj2z*#ZX2|YC~b^P<|~(0S68iShD0O+2vZRiY(EbO`FmFd@8wMpG7xSf{l*Pi-u67a zd@iW|+ByZpk{xu{^74Tr2K-~b9F2b=+p3c6gABl0U{k3^=9Y(kPtxmjg5_!m6cK?Dk9>+Q`6$&f`tBmF=vB9vK;YZFpF|8}dxybjf zH}jR>%Cq;uDnWXxou?vZRH}Uy83=!hNVP*@UI+F=EhT(#qzN6{Iss=qy-7dk2jex2 zYoik$s+DQA^I4&7NM~islv0_3!bEjp_cx3!=sm#^&lqb}sK-JzT||H6Z0Bk6z7q-+ zS)rgZc>inhaKpV`>X7ipNuFZbU^#c_f*=*JR7ErzjSPob!Iih+crME{38dBrp8i@Z z^3f-oE?bu^{ot%1OaR)0n$FYQF|BEg(uuPI(v;15`Y+bu>EArr6&3CpN4c(g#2(oY zt6RE)8S9$z!NEb0{Us80PMAPOH{J__@}zV z_Jc(yrEg>0uV)|rfr+mX_boeXEefHKgo~_?)44F-(PlNMZX8xMs?4@FTocIZgUsKa@ zj*QFY^7?FT54O__3)dbE*U%-X-Ch8diiWRn^_|7e5=k_v2~b~07RgzeDfhId?9G$5 zsN&@w|6|#v`ppodT*!z{{w0->#-ky>+wNW!(`w5d0AgEG@?)Re?tnR;n#REq0j9ND zEy>o=uF$I4InXF0k&dVCk$kVeFO~Es$T;YF?*A1 z>hS-pkbiA3|8HskV&l*E3H0KgUfk1jel5R{$_uId+NEM~iLcdH6ET|C!QUz9-DvbX J9e+&!@L%S$oq+%V literal 4885 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 diff --git a/tests/ref_imgs/widgets/label_scroll_15.png b/tests/ref_imgs/widgets/label_scroll_15.png new file mode 100644 index 0000000000000000000000000000000000000000..118797221ffab0beb6a5656a9c3f15621c41c910 GIT binary patch literal 4418 zcmeI0YfzJC7RO(8u~=-;5kaj5$FA6J11KVqh{QS~>nI?t36}tYx)9`&5DCN(AiB}* zE()|Vf&@uc*@bOF2ofoEt^1=H%-iILQgOk5M{v`yh+XX>u#vIoI&rlNcE(C4faPs&UXD{B? ztM-R|gz4vX~z=*k8dbZOsZ2WXRL0|a&a#uYkx>)!^=A<3(h{QUewJ6(e#%BH5Lr$R%uvx{)G!ev&LksOtg?Aw6EB$x+f`qxhpoxLPuw3C&s74 zVzDf~AWFlKKXE-?6ceGbNa5aw9~$R!guxL%Ww#22)a>konDxOCJ3Tz$&KCR1)YOz( z9iR2=cyC8XMC6XWG1jF^tJRv#=8yT3tZqtdZ0yEwI&*|^ zDB1AvuuYnSsEX&ow{5I((~ggizxu^41iFVW{DaNT5gy6ca@`V_z>d~Jv^wfq&PmqY zPlx65km^ARO%;hoGu{K|o|#F_y|}P}AK#iQb5Zv8_L|KU6v_ixa2xj^fR!bvuCB%l zFlAFp0ipKt!GZf+bQ*<1d2nSty&bHET(xCoG<-i)Id4XnFkPYL14j~^(M!ToI-Rb~ zd?*<8y(*RaG9`AG?Z9RJYW_;qb~#v(3Cfk5}tRGc8PaCX)${A(P2;XiJ!QKQu!Rx5oxe$CCN zxVYHek5+mpv@9+*_Oxdy@J|k24D`lho(Ly)+n$0MJ!YAEI-)Tcj6R3jl5(iz>eZ{{ zd3C5WE0E%Al_y(m0)i%)yu<#tG#sq(E}PBg^QT{43}kwTxCY;AYRV>&NCgE!tB7+P zS*rg8kIO}&nna?})Fw0TKdNqfjng-QC@DTRe12I=;(l;p!!+FwkY!Q3vFkAe}B(*i2_`%t<>)hUo6(Z zCPUwwZ84av`W!3K+FLLPBCx8qi+86RK071N=EH4w_TExc?hK~?c0{Ghw=C*7k-WmY zQL(Y33Pk_{!N3<;f`e!)ffc9m2Gj5Q8a49+;zb4Q=TNs-46r>On~m`qIs!8kXQDEg&a3%5>tDwRt9Cn~%^g_mdBb<$eh*zhnqP7d78_D~Id z(Q3yKvVN?S=;!91ik<7EI*{OLX*nDY2Zd6_J`oyskB($HGnNcr`IVD>D@Ionp-cD0 zk7%naLd`nBiNe)uo8FKQZv>IIe^A5fQ?m#V>0cxZ3sH+{$ZZ?{)R`FJk`#@{$D)W4?3 zH=Wx5ABk$)8IXHVMVGTfOLu`}Q0f7ps|t|3lz?qI{WKz(g%pnnA-{nsrW8gDg#s=U{QT5 zV3J#L@t|OgDwQ1ejDnAo^1d6##m2<6JaAxZ=E;aEPgktyB9TN|{HwY0@%hHN@$s*H zD@ed!(mg>WDvzl@cGKc&9H4?~YMEnSqivqHYBgzSn!|%Y!a@~(>6GMrVxm?hBuhK@ zhBKe8G=0`g&^(eD{46Ks{ZTH#C=?EdlS}}F#udW~zfMb=eg6Ep&6c;4-HqnR(z~%3 z42PXcp)|`yb8ysc{anaKBw}g5K#R5BA6K&^TawB zyxe? zJc9C`DHP^I)dAKNKL+iFCuzxKs=O-FCB(_?1!5H*iAO4Y7@z`fHLPyc0(F7P&XZ%J zqEb$L==mpnP-i((vJbDx_H_jD(9v&731dm0b_;u*A zsV3#Q{&T(+=>)<+F-fQborBz18_uesgCdw6M<5W8i|~Bsp?MRbRq_Rpr7`#L;lm5_ z>t;!aPVI{kh6=O?C=}f76~5I`urx}4oel5k`=7n%+g~>RS7-h1bZ_F+PP1pbXcCxgR|*B?vx<39mMII{@= literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/label_scroll_16.png b/tests/ref_imgs/widgets/label_scroll_16.png new file mode 100644 index 0000000000000000000000000000000000000000..59955799ff38aecb3f9d921c06964dd712249cc1 GIT binary patch literal 4802 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/label_scroll_17.png b/tests/ref_imgs/widgets/label_scroll_17.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8a9793fbda20c01a6c8ea110e7a588fa1f9ef5 GIT binary patch literal 4509 zcmeI0dr(?u8pe-F({yXp?Z&Dl5xd=~y=baUjTeHlX`^Yfu9PO=Es5Ig;Cir0lnD#a%%B`Qe4TS3Wlef9C&BE);`@ zmbN4%8PM+|8ZtMzS>V~G5PVW9jVWh4t z9q3bO#>bPQ>}KIc8hmZ8vSwd)PYTA{MWL2`d59%nne*UNHz;8+k1El17mvq_#pLGa z_Y;>g%D%0wt-byBz3HWr)?Ey_G?Bj&pHKM&8t}5!4y5!71TLp__AN9cj3zY{Bj8Ur z9UH^VU9(!P|2p||Zuo)LQK^W6ef5+kzfWZv%kEhs@;RKt4Z4YmiK!dT@_vD!;_TV8 zl708P)k-Co&!4xEBvtoSMqm-L%u+zn#raB;%T=SJ6>OCNLrlS*NzL4Se8H18m`sU)N}{0x+t%H1irXW_#iiY zN8J#bflPkq7SJ()$w8(kvK6JJr9c;XW0Jz-YDMgmDRE8PA|sj{?zgRj=GY9a<9VhX zcj8*RKqG`g6ueGlBJec*-|aS#6JGPIq9-uhnuh8E0^o2;(b~mq!4YtCg+<^Ay1)OX z`31FB8&aLYEy(wq>Cju9mLFp=!KD1WymnGxEJl3-_M{>4&O@W^p#vJAs~;b}AV@P$ z57oIS8y1TN^wKLJW=&82I+d}TCXH*w2(|3+zTV!iWrmE*Pt_9>X&7&+%cjT;U)2w$ zrl#WQX#PGy8kILAuJM%!+Yc>RXGi+DE3OU)&?(#FHE8i~YEupjRvX7w?2U|c0PR~3 z)DZ}TH<*{>T2tD4xm@K6swc%XcWSBQuy?GfnfqgRFionLyX4JFIvO|qOY-Sm$&8bC z8q$C(TbZ(#DvtXZLc!NSTY1ma!E zS=|$37z`+Hos+Y!PovRj;Ls`Y`2Ba-c;R~zi-uPkbpB>bi&lTz9!isfE{vJ&3Wb7& zT68!ZTaURzj*I!c7maIczus)(-;#-x;*xxy~%)H5949{9w?pLdC z`*~L3>5SB-=%aW%Dl+mH8;QE^JY|deA*DSWUMK0EFGeUTio4|5SjjD)oa=4-!XqMl z&tJ<--X+-3Te(h8Q2L`skA{bb!KkhSwSYvuy}%isUS7UIBfxaEsuyuAIRb%zc~$`% zw~Wl%NUqV=1Lp@PSJA*8_+z0DO$58$zV-azp)ax8%pN{-CF3IS@AUNa=xHEETL|o! z6F0&l3DS}qB-(pi^+7E_vVxnJmAkeLn z+OO>|cUo9xH)s+s-iUqa8Bz93y!-tx8t>a|oSd8lgbvzE7NoJ{&C;xz==K}{mEbE; zQBlcJEF3E@H#avgZS_ioZnVqsxn$xom?x@mL7{8Zh_TmVtDo=GNy#|tuN$HvBF zOtkO$V6F4sy?aYbOO`hqsH=;QMND)HgHAstctD3cES(Wr6twu4wORNqFf%%^K8q6t ztMz%MsJQruD|DwPQ)XCL$nW6-FGY6A4D)6)Aa(4ur)$BjVgyYJCbXw047P_R6@LK? z1+q&L@rk$CqIX?#o$;|#%gUmf;(-Yz-A7N3S@03`1c0#R<>lj{NgX0Ga*^fb0Xfbr zY)`7HssgNkyE>7bwrgF0$K%-)zq+Bu#>N_HCSbQFKcw*i5ed>@!)2x>5`fio+l7cn zcCS@g@B;P3iPpEP>2x~C53%tpov=e;^bdH7x?Yt@>}DrVMxer=$sw*4cIQ8=eGjm< z6d{lqu4Qt^%k2xtn6k1bzl;)*X_ry-guV1(RQh2#LIn2QluIM)4gN5YJB z)~eeRm#9E$3dZqY9by3>s0-tH8b*Aed<6W&nyO`u-5pXZBQ_aLsy>M(V)#&Mm`F%TT@2#wWd1Mo=3{79R$Ab=-uKI?g?Z4!5W^q8k zDTjv>I7+^5O(O_!Ox>zb_-}^nmfAf@?YNxxB>)J3)$KTyT75JoD{|+=87>+`zE;bY zX9vWT6D>0bdpOO*IejWT{YRdZc7wca)dfcq7Xk3E(`ANlo44LM5>oF&GZDyLue%VL z$vAhXaP}OzVhbd^ukqmue}k$*q|@m@)5T)3>6Et3%Vjc|u-nUO=qi;;^te-*JHg&Y zdC(aFHWEEvoS)CdAmv;A8UrvOB3vsawjz%5XnETbVrXaxY)ZoTmQ6wfXhPKhB08Er zG8=?{56hDO3Q=JHzMahG;nesU>|U0EuQPOJ2GwWakNv%*F1_IH4{zM)PzlF_t24-C zp4J@k^z@M;R)Yz#q(}5=rv3y>jf6L5M)_?^X&)<%S2r4&2n_E znwdjyy0SvVriiA9&KV^~xlRp<0L}0hAS$9D0{3xuyJzRzfBN&Do!-AV?|FE?&-e3u zeth5e+b_a`H*Iv-2tm-MkfTRVLXgD=5M(yG-W=TdCAP8}g8q^aa^!GC_V-Hh;gf$A zRCC8V7_)YzTmJcrx!rCk>SA3?o!j+q3sVbuBTug%etzq{Cr9o+`m71My6!3RV)eSI z+Y75UkLxR8PcU3^fsaaWx#PxAZFrXD>dc~FHWIfJSG2-Z=%U9^nH~5G`bw}lO_(&RP&mS1^$1!p_i;;00!!2v*C@tO zf@(B!Hi{utE$aI_nn-aq$A|7U%!6!>YQOV z+Yhy;EIvNIwzifhTNoY17@m)fjivak8ucokg{_SZE;(81WLjKo8k`=&GHEngBm+gK zP(xj~TyA7!q(~&Pva%YSPS46>4NjMAM!9e49-C7r>X3BF!JoRv?E^n955?hd-%%)4 za55==qO7b8l<(i2t97S_#qTRmlH6Rdld(YOt-)TRa0la+_H_}Bdy`3CiCz`gdd>w@W%*L)vtKGRuT^iQa6u!NMMAD@y^3w#Bx}zMxMhz?I9#e5l9mY-z*8K=Ng2iIF7KbznzYlc*sO$B5 zDN)^rWj;jEIK~w@AX2wLbKsaGg6IRCB_v z2b@G}>P+6RHD>ObL*%F12@Nxvm4cxVa3E>NGg`MzNw_g8SWD|&gIKAwbv{@g`p|UB zE>I^O#%dU3gS^0*q@AHL0#f`H=S$_GvCoMSolKDubTg396upPX&7mU__mzjb6vy)` z{fTFt586R*^Lt;zZGvcol zaLL&dv6iK0c&eAx!Q36JaQgDm3}32_*dh5u)0vT{_yX!I&VK#=SB*kIE*W2602iv3 z6PZYz=rR+j)Tt+Bw|i@PEyyd=wVnp6_W*b#q0nW>+cn3$SMNKBM-oym0wn!Ff= zLg6l4$kQuXZEbD#_Vx@k$0#d97gpa#(15gpgM+~nWKv3tCr}Z5uM*45C6P#Y{60sU z|Ljgs?n~{@y{}X%1q?L9c}7e)yBsz?a0j{wm%=3-dHSI=EgTq*L?T(qnu4GXA4(m@ zu;H;7clYGiOeD}tYjg)uhbIuuoHc{c^|k1(+kJ6Bo*cuHNU6L4j)I9a=EXvz*OnH6 zUCw!rI}YzeT(ZZz2i@Jg5zRy)Ygy&3FJyh~p2H-j#N6+26h z(Gi4)jpT2-F#p1_s%8{qgWdva=fkUJe$MY2eGp~{Od&&~Jk8-R$z zg&-_4+t>%vpwV!3HU`8MSdU}b+SS}|F4^sPM_MIjlgi)?l zM{$0H?esR8K7mn^ak&2e{`&fQEb|3m+2co`ILI-M$*2d>gP*9d0wixn(*KY{5q3Sm zz-tE|3}ZofFi>nHrI>9|{OmQ*hgPcv3IZwA|MRToZ)vys;(!RKVUsg6Gu=2CbYoGw z{U_kPSSAS2n0+~#nNw_(M`3le!#0}&prHz9924p4>I$?eOxm;MnvN)$PJc3<$`YNm z)#U8?VdTXNUpSnBpaq_=w#>(G!0z2z;tBWn-`yDZdzxr20U^p6yGoCpJ^;M$>0S;b2G3kQh#~3c#+_>dz#s@$x8!zHGhb(zTwBHef0Ou3r>{ zCL1(*(pCD)f+k7Q&~!T3sVlA%An5Jwo!^D=syG`RT|zN=i6xR*rSdF#?OM)d0~hCT z(EaVhSa$aOx&02M+%@;hizs)OAr^&6nRxtyE*2vlGPz1D?us?SJ zes3dWg8MIglLCef!%>=4CBQQ0vxzx5txTpy$&z-czK(3gfH|l)nRg*%&CE+C^MSnk zD!hTEf~zQKT&rza&EWJEdpQ)@d!SxQB;W@as5HjKF3jGo)~F8R>5h!d%x02J6dl3m z^TWf!{@(o+9kELtoA;!mqN1jzhEAtDlUE-h=>bY7x4fs0%`6sBVXvI6p4*WLGM&oS7d0hz&d#RS8r61IO0csQ?U~6@;+;_SQg1;u2_n(yW|OM3 zr=N)ciKYp8u|H(A)$*|PycV+eE*{-+ z=ev6R=sFx~ehsa`jZCprv|I1yY~5ktv==$1wN1^UIaFM4+GHGnpjDZFycu-W3I!D( zy|NQ}^ZgbGdia_x^zn@c=FsbVBOoZj{0-=x!2j5!n{cJ_IGhP3fy3b(c$dj!hKGj> z3~QgZKZ$wUFd;B@+I8Q%XJ=DdIe6<(8G*~^a=GZUnTd(dL?sl%Mk@^W#iY4b@JXw}7gZ-ig4gQH`)KZ7C= z*mVm8GMP-kw?0X(o;F}Y5!^!QNbr)w{+6ScUpDe{i)C!Jt35CMCx;hx97&jL$ zCr4|%a0CKDq9jZzbzGv#_DbiY4sfnmj;a~W_E^sI6d1P@L-Db<5fg?xA2D}AJ+~KC zy-%gmBf{K#HY`eYaB>RAYFGa#A^SMll(KPxxWRvFUEg9oQ%-U&&u(u#tFW}R#3)Dm zKVynTsU2Kybg59Q)rN29M^-aLscPNQ5{weESgihqg*?xO;pC*q7F%7M#RPNO%+_n78wWL@QRX-`St@&myVCwPXi0++f zNA3QR6ge=5@HJ!;2s*50Vm>tG2?^aJ5V#849x*n_ap=cRC|{krM^9>*iK8ZO4>f+p_uDi6CJvCj{S zrTY}YxRFIoKjA{~zQV%7l#~>AcXx&ALr}x5WP?(vgkjHypmtD?sSG!JEkT;?5z|f9 z&R4c9bSUU%&^zZ@ha(uGJL75I4s862kEdtUwJ}b-t14m}DLjC$W-G=xaSe1jb$yyB z3>ZP?Bqk=FOoibO%Fctc)E9&IAxu@W8lY0a;)?9#s3m6esgif@M(z;yx`qVe(Z^S4k!qDsojaI_d+)HqQMIYc7y(j|?-Kz6e) zs#|=Eyss&Z%eN}Wv|`n|qMX-1lj>$~ZNUmtaHcW3FD_F1GN1>l7lunM z{*2(rYK+n?Gb01^2fe=D&Az@|fvq^KT;*Dm!TGq(!6izYmkq!8pB` zCdwR+9AA4g>U^P93h#^$6~z; z%8=ex3JiDQAyoVwXwIm7c<~fJ4)12~;#;m+TU(o(YlPu~Xx4NV8;!i=s1rTaRh@+k7uGj!iZ_>D=#kj6R~@Ha3N` zmnsP)QUp68VbjeVlKqS`{kqe@_GhTY7~lPVpvB#510OwltV#qzx4wZN!c zd%DQAt6%}gc{Wg?#+pGRTb0rhz|^uva79c}0v^vEPup!#vZc)P1TF~7A&uhw0W|Yz9jvHDUN&&gghi{Tlw0FvN5~7oKaY)f5MoO$y|>V@AngBah#-!p{hM` zI2<02uNZg+q-#S(vm{0%h5zYBHZ?oxX%s_5B6#CEyOP`U$>bPSJOPlE*}gFda>It; z3~&yEAO*nV!a_0tGSLbUb7;P)>LRW24!i`=sxVZuqoUaphlRNw4%ht|?szFL zU$fw3+8FRmvVsf&MYIP6>bZW<*F!TIC!%|PY|HHhZj8!0Lmf(WgH`%w7(P_i(9kfC zu`KEJEYhu>6Q2Twdj1^b9t_=wPuaeYyi2t5YIwxZmmC%!(d`usd8UI$tf_OuvH$}z6{sp+*5gt( z*H?-FUMy^%o}N~!R2ZiCOu`uV>NZ6nb&9bDc8ahl0lx~e+IGHcco4)4!D9J2k=64c z7I-#X|H-@=xlAx zDJm+WQcbG~uK{t7+JTV5-tw#P$^2gWUd%G$2qhE<45tx^>%vl!lebyZ+DkGH(8 z2bmIB1&D5wN~D8>q3e{peR()L&IO4%YG;isI{gWsP0Y?-{eqT&2$w1ePMK|ODCf$- zp|BZ=1Pr@CBSSP(!@?z9;OQw8A3JMM+z|TsZ}B8D^F$qpkw~{)5cMko*=X3Th}!`@ zpjP?HFM$ATH0}A{!S{Dd_m|K9uOxW6ccfQ3z0&C=U#DNS%BxoSe`pnxMTRgftPw?@ S2Y*CCXZ?asH-8fU`M&`t)p;BM literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/obj_flag_overflow_visible_1_1.png b/tests/ref_imgs/widgets/obj_flag_overflow_visible_1_1.png index 085acc74911c7b5d72986f0f1c29984c161735fb..4d1be59109b66bb41c6451626ec0ce839c8fd5fc 100644 GIT binary patch literal 6056 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 E03$Nv)c^nh diff --git a/tests/ref_imgs/widgets/obj_flag_overflow_visible_1_2.png b/tests/ref_imgs/widgets/obj_flag_overflow_visible_1_2.png index d3a5c83686ed950449ffeca8f247389478268ced..983a73cb545ef9b4ae57123f8b1fd0ab7f2d04cf 100644 GIT binary patch literal 6204 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 diff --git a/tests/ref_imgs/widgets/obj_flag_overflow_visible_1_3.png b/tests/ref_imgs/widgets/obj_flag_overflow_visible_1_3.png index f74cb9e5dceaf10e77f1b8ef1259aed1adb71735..73680c60208e4468e0c813cb2b4eb51845b124b2 100644 GIT binary patch literal 6570 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 P7|>Y<=iexHzPJ7d+^ryX literal 6570 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 F??18$GCBYN diff --git a/tests/ref_imgs_vg_lite/widgets/label_scroll_13.png b/tests/ref_imgs_vg_lite/widgets/label_scroll_13.png index 02f28a9ac37a69576acd174340986b2dde29c16e..79a398eb3329824eed01b172fca07233a19fca7a 100644 GIT binary patch delta 2446 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 t2y&gZ!f$Wk_xK^({1ei#4% diff --git a/tests/ref_imgs_vg_lite/widgets/label_scroll_14.png b/tests/ref_imgs_vg_lite/widgets/label_scroll_14.png index f63e6b164fd3a47a378f9afd526c1f59774816a6..49ced9ad793bf55557170824ce8ecd0e5ba198ea 100644 GIT binary patch literal 4838 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 diff --git a/tests/ref_imgs_vg_lite/widgets/label_scroll_15.png b/tests/ref_imgs_vg_lite/widgets/label_scroll_15.png new file mode 100644 index 0000000000000000000000000000000000000000..37ae6e158e681228c5569f9bbf37672338b41733 GIT binary patch literal 4413 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 J{8rju{{=*%_@w{< literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/label_scroll_18.png b/tests/ref_imgs_vg_lite/widgets/label_scroll_18.png new file mode 100644 index 0000000000000000000000000000000000000000..decf11728ba10ff6af820d820df938be760ff06d GIT binary patch literal 4797 zcmeI0e^gRw8pm%rWjmG4&NSAVgYCGfV~sZDXi7pelRDFOEGH#Hg{Cac6cZ5;5p3(M zGdjl3>4)Pu%BGnWgQSLph-e*Si`0k^2?fy<6$ud$5rKVe_srS9_VjP(bpO2Px$k{= z-tYJGeJ?*8jE!0QuGhN|1g-t%>%HGXklSVmS~j$5Ik@xmM0E`Wy?_3jyDvD ze(QCrR&1gjs4{e{_%XR7V8eTSXuE#dp!lBS{8Z;}A2x;7H51QdcdmFZc&KYrQ8E;J zg6^3TEdHQutT%WhwMWNc|DgjNqWeng~C&%Z1eOnB+~8(1n|mkud)Y*!M_Rwg0!?W$!HUXqtII{ zbJ{cH0!>Z8$>t+M46|3qbH}n#OfRk0lSQtr+L?CcH)uv6GbUIym zdAYu@UUo{PK_Zd#xhZ95=NHN}15uC+=O%88t_91*anVB3`C@T!$*~<3$tfuoyMrcj zNgvZ)4l9afk#3>P2UNwTMN~Ctu6)E-?_lU)2?M~DvOR= zk95q+Iy*bvuu0oIH*DA-7K=v@%tqJ7u~CxDK+(aQ@#^-%q;_?Gf4@ovO1S8(#>D-8 z7gcavX6AsPp$)}K2)tYq(9+V<=U%nn4|ESogpTgYu(Igm+c!>4O|4mZj>TdT1u4~C zgMWm<=#gfmbH0`;FtIK#aUid-FlBw0fjMp<7KC_RMmkGt`qgR-Js$T-j6iTa z-!+zd9rIGa5eUd2`st6 zV0f6?#N~co6$>7;TCGeZy&cWIC7&cjL`FnV=G)rSZ)At(Ktrs^_Y=WxUEX&B!9-Hs z^$i7;LoG+hlhvDv9wQ0YNY9xR@Wo)FxZf1yy`$`Ista%9Ow;E9~&ALR$6mc zc&#;g4Z(Q4NdQ-4p3+G9_WSnOdf6m>eN>#2k7i?p6pJcbl$Dhg*-DwxUn(7!{AQ~u zI?Y7`u>srgldmw$Xm(%fj*8g&?vrNi(r}?7f73itww>9F7112iqzo>a->^74O9-u8 zTYO)dJ_}Zij3D!m^FOAAR#sJ41C@J5RyOftbZxOHeB&C>U4GaJa7$w>x5mQ~UXm#kN^Wj5 zpP!G%&)iJQ0-6~Vkc1dc@(y5dg?l6%&WaBlrOe4>G8+}+T#4nP4OY7lV^lV$B_$=1 zV#wr0_vlR0>E&Ad=9~&|kX8B;~-GE}R~Y!L{OI10c|j$&&XNSFd5u_ZZ3 zZ=nb=BGRwfZOeVu_8W*BO1mg_H-%0bzCP-+iv2_)5!dSt%}aK}5&`P?$t}RDoUp1` zyTfU-*_zXOJv=;KItfNXglvM~Ant~3h-y?f!2-ivuDqO_oV>g|0)arIVOa9Hxw*bS zgMombGiS8|#XhRgs7+Q4J)4X6_xE?u=m@5WV!0JiGBPqk6bKs|b7(YLem)=OU$6rB zR4z{tX^d8TX;+QPfS~-s+*xd+s`ZwLsvgjZE@d~gdBPNP9;BZ<<5SPlhpG7d{39%R zNlpLr=Yb`|ui!p1S6H;fcfWjUzP?Je0?H#28Y0jsX> zdKG}X;P9ty zZeL#?Az~0btT}CJ2_^sF@-n#3?N*~A+j#x{5@tACnEU-k9ar&VJjG=V#y6os7PxaOz%2vRCWo9Uh0kY6}6Z;)_9SARdJ>EdH zFDy_ZpD9j-RvOj9O&-N&8%T^h)J2l2ySp1q9VEQmeG1BeDNW?X7p|WJp+(p1zkKiQt81cN z`+SN0&&j(HuXqkRICMY&b|iI&&7#0cc%x0%Y*go`V13n>_4W1O7co4>0SSn zXJp}UAhpy31DQBnHIvCv)B`}QTS~Wh8nD(Kng`gG-}w)y4Ezuw0s{r}0|z&XZBd3f z`&9Q>3o_&I;lragr(NT6KJZ-*VJERZ2r79p{2hW|a9`c<4;!Ir(h#y><$n*ru7AXw zhakGo%hx_Bzp>bU+xY8!3ca1v+c~}FSMyt`yp_tECl!|);z}w3-gu=B{4E826BWC+ J;mf0c`!~5`gx&xE literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/label_scroll_19.png b/tests/ref_imgs_vg_lite/widgets/label_scroll_19.png new file mode 100644 index 0000000000000000000000000000000000000000..4a21dbe0c14ef9280bdde98a61515f2481fcfe0a GIT binary patch literal 4788 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/obj_flag_overflow_visible_1_1.png b/tests/ref_imgs_vg_lite/widgets/obj_flag_overflow_visible_1_1.png index 1db6cdac6cb04c87e802fedbee0d6283e48284f9..22b1c35d094aae49eb8cdf22649202c148f1be79 100644 GIT binary patch literal 6652 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 literal 6659 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 ff9l{fI23i(i90T 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 diff --git a/tests/ref_imgs_vg_lite/widgets/obj_flag_overflow_visible_1_3.png b/tests/ref_imgs_vg_lite/widgets/obj_flag_overflow_visible_1_3.png index 8d9d6ff2bc1b68ec3a16864e66459ef0317549fa..27a5890d33228451995c0c8020959978bd18a516 100644 GIT binary patch literal 7266 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 diff --git a/tests/src/lv_test_conf_full.h b/tests/src/lv_test_conf_full.h index f4ece2d15..2d8206cf6 100644 --- a/tests/src/lv_test_conf_full.h +++ b/tests/src/lv_test_conf_full.h @@ -104,6 +104,8 @@ #define LV_PROFILER_INCLUDE "lv_profiler_builtin.h" #define LV_USE_GRIDNAV 1 #define LV_USE_XML 1 +#define LV_USE_TEST 1 +#define LV_USE_TEST_SCREENSHOT_COMPARE 1 #define LV_BUILD_EXAMPLES 1 #define LV_USE_DEMO_WIDGETS 1 diff --git a/tests/src/lv_test_conf_minimal.h b/tests/src/lv_test_conf_minimal.h index 20eb2c35a..c4848a288 100644 --- a/tests/src/lv_test_conf_minimal.h +++ b/tests/src/lv_test_conf_minimal.h @@ -8,6 +8,8 @@ #define LV_USE_ASSERT_MEM_INTEGRITY 0 #define LV_USE_ASSERT_OBJ 0 #define LV_USE_ASSERT_STYLE 0 +#define LV_USE_TEST 1 +#define LV_USE_TEST_SCREENSHOT_COMPARE 1 #define LV_USE_BIDI 0 #define LV_USE_ARABIC_PERSIAN_CHARS 0 diff --git a/tests/src/lv_test_helpers.c b/tests/src/lv_test_helpers.c deleted file mode 100644 index 7362bfd68..000000000 --- a/tests/src/lv_test_helpers.c +++ /dev/null @@ -1,12 +0,0 @@ -#if LV_BUILD_TEST - -#include "lv_test_helpers.h" - -void lv_test_wait(uint32_t ms) -{ - lv_tick_inc(ms); - lv_timer_handler(); - lv_refr_now(NULL); -} - -#endif diff --git a/tests/src/lv_test_helpers.h b/tests/src/lv_test_helpers.h deleted file mode 100644 index 5f155567c..000000000 --- a/tests/src/lv_test_helpers.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef LV_TEST_HELPERS_H -#define LV_TEST_HELPERS_H - -#include "lv_test_conf.h" -#include "../lvgl.h" - -#ifdef LVGL_CI_USING_SYS_HEAP -/* Skip checking heap as we don't have the info available */ -#define LV_HEAP_CHECK(x) do {} while(0) -/* Pick a non-zero value */ -#define lv_test_get_free_mem() (65536) -#else -#define LV_HEAP_CHECK(x) x - -static inline size_t lv_test_get_free_mem(void) -{ - lv_mem_monitor_t m1; - lv_mem_monitor(&m1); - return m1.free_size; -} -#endif /* LVGL_CI_USING_SYS_HEAP */ - -#define CANVAS_WIDTH_TO_STRIDE(w, px_size) ((((w) * (px_size) + (LV_DRAW_BUF_STRIDE_ALIGN - 1)) / LV_DRAW_BUF_STRIDE_ALIGN) * LV_DRAW_BUF_STRIDE_ALIGN) - -void lv_test_wait(uint32_t ms); - -#endif /*LV_TEST_HELPERS_H*/ diff --git a/tests/src/lv_test_indev.c b/tests/src/lv_test_indev.c deleted file mode 100644 index 503660074..000000000 --- a/tests/src/lv_test_indev.c +++ /dev/null @@ -1,135 +0,0 @@ -#include "../../src/indev/lv_indev_private.h" -#if LV_BUILD_TEST -#include "../lvgl.h" -#include -#include - -#include "lv_test_indev.h" -#include "lv_test_init.h" - -static int32_t x_act; -static int32_t y_act; -static uint32_t key_act; -static int32_t diff_act; -static bool mouse_pressed; -static bool key_pressed; -static bool enc_pressed; - -void lv_test_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - LV_UNUSED(indev); - lv_point_set(&data->point, x_act, y_act); - data->state = mouse_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; -} - -void lv_test_mouse_move_to(int32_t x, int32_t y) -{ - x_act = x; - y_act = y; -} - -void lv_test_mouse_move_by(int32_t x, int32_t y) -{ - x_act += x; - y_act += y; -} - -void lv_test_mouse_press(void) -{ - mouse_pressed = true; -} - -void lv_test_mouse_release(void) -{ - mouse_pressed = false; -} - -void lv_test_mouse_click_at(int32_t x, int32_t y) -{ - lv_test_mouse_release(); - lv_test_indev_wait(50); - lv_test_mouse_move_to(x, y); - lv_test_mouse_press(); - lv_test_indev_wait(50); - lv_test_mouse_release(); - lv_test_indev_wait(50); -} - -void lv_test_keypad_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - LV_UNUSED(indev); - data->key = key_act; - data->state = key_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; -} - -void lv_test_key_press(uint32_t k) -{ - key_act = k; - key_pressed = true; -} - -void lv_test_key_release(void) -{ - key_pressed = false; -} - -void lv_test_key_hit(uint32_t k) -{ - lv_test_key_release(); - lv_test_indev_wait(50); - lv_test_key_press(k); - lv_test_mouse_press(); - lv_test_indev_wait(50); - lv_test_key_release(); - lv_test_indev_wait(50); -} - -void lv_test_encoder_read_cb(lv_indev_t * indev, lv_indev_data_t * data) -{ - LV_UNUSED(indev); - data->enc_diff = diff_act; - data->state = enc_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; - diff_act = 0; -} - -void lv_test_encoder_add_diff(int32_t d) -{ - diff_act += d; -} - -void lv_test_encoder_turn(int32_t d) -{ - diff_act += d; - lv_test_indev_wait(50); -} - -void lv_test_encoder_press(void) -{ - enc_pressed = true; -} - -void lv_test_encoder_release(void) -{ - enc_pressed = false; -} - -void lv_test_encoder_click(void) -{ - lv_test_encoder_release(); - lv_test_indev_wait(50); - lv_test_encoder_press(); - lv_test_indev_wait(50); - lv_test_encoder_release(); - lv_test_indev_wait(50); -} - -void lv_test_indev_wait(uint32_t ms) -{ - uint32_t t = lv_tick_get(); - while(lv_tick_elaps(t) < ms) { - lv_timer_handler(); - lv_tick_inc(1); - } -} - -#endif diff --git a/tests/src/lv_test_indev.h b/tests/src/lv_test_indev.h deleted file mode 100644 index 6b524d47d..000000000 --- a/tests/src/lv_test_indev.h +++ /dev/null @@ -1,52 +0,0 @@ - -#ifndef LV_TEST_INDEV_H -#define LV_TEST_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "../lvgl.h" - -void lv_test_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data); - -void lv_test_mouse_move_to(int32_t x, int32_t y); -void lv_test_mouse_move_by(int32_t x, int32_t y); -void lv_test_mouse_press(void); -void lv_test_mouse_release(void); -void lv_test_mouse_click_at(int32_t x, int32_t y); - -void lv_test_keypad_read_cb(lv_indev_t * indev, lv_indev_data_t * data); - -void lv_test_key_press(uint32_t k); -void lv_test_key_release(void); -void lv_test_key_hit(uint32_t k); - -/* encoder read callback */ -void lv_test_encoder_read_cb(lv_indev_t * indev, lv_indev_data_t * data) ; - -/* Simulate encoder rotation, use positive parameter to rotate to the right - * and negative to rotate to the left */ -void lv_test_encoder_add_diff(int32_t d); -/* Same as lv_test_encoder_add_diff but with additional delay */ -void lv_test_encoder_turn(int32_t d); -/* Set encoder to pressed */ -void lv_test_encoder_press(void); -/* Set encoder to released */ -void lv_test_encoder_release(void); -/* Simulate release+press+release (including delays) */ -void lv_test_encoder_click(void); - -/* Simulate delay */ -void lv_test_indev_wait(uint32_t ms); - -extern lv_indev_t * lv_test_mouse_indev; -extern lv_indev_t * lv_test_keypad_indev; -extern lv_indev_t * lv_test_encoder_indev; - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_TEST_INDEV_H*/ diff --git a/tests/src/lv_test_init.c b/tests/src/lv_test_init.c index 9ce34b30c..074447715 100644 --- a/tests/src/lv_test_init.c +++ b/tests/src/lv_test_init.c @@ -1,6 +1,5 @@ #if LV_BUILD_TEST #include "lv_test_init.h" -#include "lv_test_indev.h" #include #include #include @@ -9,15 +8,8 @@ #define HOR_RES 800 #define VER_RES 480 -static void hal_init(void); -static void dummy_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); static void test_log_print_cb(lv_log_level_t level, const char * buf); -uint8_t * last_flushed_buf; -lv_indev_t * lv_test_mouse_indev; -lv_indev_t * lv_test_keypad_indev; -lv_indev_t * lv_test_encoder_indev; - void lv_test_init(void) { lv_init(); @@ -29,7 +21,9 @@ void lv_test_init(void) lv_profiler_builtin_set_enable(false); #endif - hal_init(); + lv_test_display_create(HOR_RES, VER_RES); + lv_test_indev_create_all(); + #if LV_USE_SYSMON #if LV_USE_MEM_MONITOR lv_sysmon_hide_memory(NULL); @@ -45,47 +39,6 @@ void lv_test_deinit(void) lv_mem_deinit(); } -static void color_format_changled_event_cb(lv_event_t * e) -{ - lv_display_t * disp = lv_event_get_target(e); - lv_color_format_t cf = lv_display_get_color_format(disp); - lv_draw_buf_t * draw_buf = lv_display_get_buf_active(NULL); - - lv_display_set_buffers(disp, lv_draw_buf_align(draw_buf->unaligned_data, cf), NULL, draw_buf->data_size, - LV_DISPLAY_RENDER_MODE_DIRECT); - -} - -static void hal_init(void) -{ - - static lv_color32_t test_fb[(HOR_RES + LV_DRAW_BUF_STRIDE_ALIGN - 1) * VER_RES + LV_DRAW_BUF_ALIGN]; - lv_display_t * disp = lv_display_create(HOR_RES, VER_RES); - lv_display_set_buffers(disp, lv_draw_buf_align(test_fb, LV_COLOR_FORMAT_ARGB8888), NULL, HOR_RES * VER_RES * 4, - LV_DISPLAY_RENDER_MODE_DIRECT); - lv_display_set_flush_cb(disp, dummy_flush_cb); - lv_display_add_event_cb(disp, color_format_changled_event_cb, LV_EVENT_COLOR_FORMAT_CHANGED, NULL); - lv_test_mouse_indev = lv_indev_create(); - lv_indev_set_type(lv_test_mouse_indev, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(lv_test_mouse_indev, lv_test_mouse_read_cb); - - lv_test_keypad_indev = lv_indev_create(); - lv_indev_set_type(lv_test_keypad_indev, LV_INDEV_TYPE_KEYPAD); - lv_indev_set_read_cb(lv_test_keypad_indev, lv_test_keypad_read_cb); - - lv_test_encoder_indev = lv_indev_create(); - lv_indev_set_type(lv_test_encoder_indev, LV_INDEV_TYPE_ENCODER); - lv_indev_set_read_cb(lv_test_encoder_indev, lv_test_encoder_read_cb); -} - -static void dummy_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) -{ - LV_UNUSED(area); - LV_UNUSED(color_p); - last_flushed_buf = color_p; - lv_display_flush_ready(disp); -} - static void test_log_print_cb(lv_log_level_t level, const char * buf) { if(level < LV_LOG_LEVEL_WARN) { diff --git a/tests/src/test_cases/cache/test_cache.c b/tests/src/test_cases/cache/test_cache.c index ce181bf7e..baade8b76 100644 --- a/tests/src/test_cases/cache/test_cache.c +++ b/tests/src/test_cases/cache/test_cache.c @@ -2,7 +2,7 @@ #include "../lvgl.h" #include "../../lvgl_private.h" -#include "lv_test_helpers.h" + #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_blend.c b/tests/src/test_cases/draw/test_draw_blend.c index ce2e5536e..87784e017 100644 --- a/tests/src/test_cases/draw/test_draw_blend.c +++ b/tests/src/test_cases/draw/test_draw_blend.c @@ -1,7 +1,7 @@ #if LV_BUILD_TEST #include "../lvgl.h" #include "../../lvgl_private.h" -#include "lv_test_helpers.h" + #include "unity/unity.h" @@ -123,9 +123,9 @@ static void canvas_draw(const char * name, lv_color_format_t large_render_cf) { lv_obj_clean(lv_screen_active()); - static LV_ATTRIBUTE_MEM_ALIGN uint8_t canvas_buf[CANVAS_WIDTH_TO_STRIDE(180, 4) * 180 + LV_DRAW_BUF_ALIGN]; + static LV_ATTRIBUTE_MEM_ALIGN uint8_t canvas_buf[LV_TEST_WIDTH_TO_STRIDE(180, 4) * 180 + LV_DRAW_BUF_ALIGN]; - static uint8_t canvas2_buf[CANVAS_WIDTH_TO_STRIDE(768, 4) * 390 + LV_DRAW_BUF_ALIGN]; + static uint8_t canvas2_buf[LV_TEST_WIDTH_TO_STRIDE(768, 4) * 390 + LV_DRAW_BUF_ALIGN]; lv_obj_t * canvas2 = lv_canvas_create(lv_screen_active()); lv_canvas_set_buffer(canvas2, lv_draw_buf_align(canvas2_buf, large_render_cf), 768, 390, large_render_cf); lv_canvas_fill_bg(canvas2, lv_palette_lighten(LV_PALETTE_BLUE_GREY, 2), LV_OPA_COVER); diff --git a/tests/src/test_cases/draw/test_draw_svg.c b/tests/src/test_cases/draw/test_draw_svg.c index 501cbbefb..d106df181 100644 --- a/tests/src/test_cases/draw/test_draw_svg.c +++ b/tests/src/test_cases/draw/test_draw_svg.c @@ -1,6 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" -#include "lv_test_helpers.h" + #include #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_vector.c b/tests/src/test_cases/draw/test_draw_vector.c index 279158522..f1fa2815b 100644 --- a/tests/src/test_cases/draw/test_draw_vector.c +++ b/tests/src/test_cases/draw/test_draw_vector.c @@ -1,7 +1,7 @@ #if LV_BUILD_TEST #include "../lvgl.h" #include "../../lvgl_private.h" -#include "lv_test_helpers.h" + #include "unity/unity.h" diff --git a/tests/src/test_cases/libs/test_bmp.c b/tests/src/test_cases/libs/test_bmp.c index 6230647d6..fdd4ca050 100644 --- a/tests/src/test_cases/libs/test_bmp.c +++ b/tests/src/test_cases/libs/test_bmp.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/libs/test_libjpeg_turbo.c b/tests/src/test_cases/libs/test_libjpeg_turbo.c index b084de569..248b8de43 100644 --- a/tests/src/test_cases/libs/test_libjpeg_turbo.c +++ b/tests/src/test_cases/libs/test_libjpeg_turbo.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/libs/test_libpng.c b/tests/src/test_cases/libs/test_libpng.c index 4db9b80c5..bf88047f2 100644 --- a/tests/src/test_cases/libs/test_libpng.c +++ b/tests/src/test_cases/libs/test_libpng.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/libs/test_lodepng.c b/tests/src/test_cases/libs/test_lodepng.c index aae78f309..4c975edb9 100644 --- a/tests/src/test_cases/libs/test_lodepng.c +++ b/tests/src/test_cases/libs/test_lodepng.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/libs/test_memmove.c b/tests/src/test_cases/libs/test_memmove.c index cb28a5b73..b8e45c080 100644 --- a/tests/src/test_cases/libs/test_memmove.c +++ b/tests/src/test_cases/libs/test_memmove.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/libs/test_tjpgd.c b/tests/src/test_cases/libs/test_tjpgd.c index 2ee8422d3..0d0b5fdd9 100644 --- a/tests/src/test_cases/libs/test_tjpgd.c +++ b/tests/src/test_cases/libs/test_tjpgd.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/test_anim.c b/tests/src/test_cases/test_anim.c index 2e3e98329..00446d1d2 100644 --- a/tests/src/test_cases/test_anim.c +++ b/tests/src/test_cases/test_anim.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { @@ -134,7 +134,6 @@ void test_anim_pause_for(void) lv_anim_t * animation = lv_anim_start(&a); lv_anim_pause_for(animation, 20); - lv_test_wait(40); TEST_ASSERT_EQUAL(19, var); diff --git a/tests/src/test_cases/test_anim_timeline.c b/tests/src/test_cases/test_anim_timeline.c index 993aa4c89..8f6f06e7b 100644 --- a/tests/src/test_cases/test_anim_timeline.c +++ b/tests/src/test_cases/test_anim_timeline.c @@ -4,7 +4,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + static lv_anim_timeline_t * anim_timeline; diff --git a/tests/src/test_cases/test_bindings.c b/tests/src/test_cases/test_bindings.c index 4a46fe753..746dc1640 100644 --- a/tests/src/test_cases/test_bindings.c +++ b/tests/src/test_cases/test_bindings.c @@ -3,8 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" -#include "lv_test_helpers.h" static void create_ui(void); static void chart_type_observer_cb(lv_observer_t * observer, lv_subject_t * subject); @@ -28,7 +26,7 @@ void test_binding(void) create_ui(); /*Wait for the animation*/ - lv_test_indev_wait(500); + lv_test_wait(500); TEST_ASSERT_EQUAL_SCREENSHOT("binding.png"); } diff --git a/tests/src/test_cases/test_click.c b/tests/src/test_cases/test_click.c index 9cff59774..b81d299a1 100644 --- a/tests/src/test_cases/test_click.c +++ b/tests/src/test_cases/test_click.c @@ -1,6 +1,5 @@ #if LV_BUILD_TEST #include "../lvgl.h" -#include "../lv_test_indev.h" #include "unity/unity.h" void setUp(void) @@ -136,7 +135,7 @@ void test_click(void) /*Resetting the click streak due to time.*/ lv_memzero(&counts, sizeof(counts)); - lv_test_indev_wait(1000); + lv_test_wait(1000); lv_test_mouse_click_at(12, 14); TEST_ASSERT_EQUAL_UINT32(1, counts.num_clicked); TEST_ASSERT_EQUAL_UINT32(1, counts.num_short_clicked); @@ -149,9 +148,9 @@ void test_click(void) /*Long press does not continue (or start) click streak.*/ lv_memzero(&counts, sizeof(counts)); lv_test_mouse_press(); - lv_test_indev_wait(1000); + lv_test_wait(1000); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); TEST_ASSERT_EQUAL_UINT32(1, counts.num_clicked); TEST_ASSERT_EQUAL_UINT32(0, counts.num_short_clicked); TEST_ASSERT_EQUAL_UINT32(0, counts.num_single_clicked); diff --git a/tests/src/test_cases/test_demo_stress.c b/tests/src/test_cases/test_demo_stress.c index 56ee06744..823bb45c9 100644 --- a/tests/src/test_cases/test_demo_stress.c +++ b/tests/src/test_cases/test_demo_stress.c @@ -5,9 +5,6 @@ #include "unity/unity.h" -#include "lv_test_helpers.h" -#include "lv_test_indev.h" - static void loop_through_stress_test(void) { #if LV_USE_DEMO_STRESS diff --git a/tests/src/test_cases/test_demo_widgets.c b/tests/src/test_cases/test_demo_widgets.c index b9c5e55e3..37e606801 100644 --- a/tests/src/test_cases/test_demo_widgets.c +++ b/tests/src/test_cases/test_demo_widgets.c @@ -5,9 +5,6 @@ #include "unity/unity.h" -#include "lv_test_helpers.h" -#include "lv_test_indev.h" - void test_demo_widgets(void) { #if LV_USE_DEMO_WIDGETS diff --git a/tests/src/test_cases/test_draw_buf_stride.c b/tests/src/test_cases/test_draw_buf_stride.c index a3ec51e37..d0e6186df 100644 --- a/tests/src/test_cases/test_draw_buf_stride.c +++ b/tests/src/test_cases/test_draw_buf_stride.c @@ -3,7 +3,7 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_helpers.h" + void setUp(void) { diff --git a/tests/src/test_cases/test_event.c b/tests/src/test_cases/test_event.c index 3f0dd3407..8aef1f017 100644 --- a/tests/src/test_cases/test_event.c +++ b/tests/src/test_cases/test_event.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" static void event_object_deletion_cb(const lv_obj_class_t * cls, lv_event_t * e) { diff --git a/tests/src/test_cases/test_gridnav.c b/tests/src/test_cases/test_gridnav.c index 014a74772..9e27733e8 100644 --- a/tests/src/test_cases/test_gridnav.c +++ b/tests/src/test_cases/test_gridnav.c @@ -2,7 +2,6 @@ #include "../lvgl.h" #include "unity/unity.h" -#include "lv_test_indev.h" static lv_obj_t * g_screen; static lv_group_t * g_group; @@ -40,7 +39,7 @@ static void gridnav_one_axis_move_only(uint32_t key_grid_axis_next, lv_gridnav_ctrl_t gridnav_ctrl, lv_flex_flow_t flex_flow) { - lv_indev_set_group(lv_test_keypad_indev, g_group); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_KEYPAD), g_group); lv_obj_t * cont = lv_obj_create(g_screen); lv_obj_set_flex_flow(cont, flex_flow); diff --git a/tests/src/test_cases/test_hover.c b/tests/src/test_cases/test_hover.c index 66cbcfb0c..899977ac5 100644 --- a/tests/src/test_cases/test_hover.c +++ b/tests/src/test_cases/test_hover.c @@ -1,6 +1,5 @@ #if LV_BUILD_TEST #include "../lvgl.h" -#include "../lv_test_indev.h" #include "unity/unity.h" #define TEST_HOVER_COUNTS 20 @@ -46,7 +45,7 @@ static void test_move_mouse(lv_point_t * point, uint8_t size) for(uint8_t j = 0; j < TEST_HOVER_COUNTS; j++) { for(uint8_t i = 0; i < size; i++) { lv_test_mouse_move_to(p[i].x, p[i].y); - lv_test_indev_wait(50); + lv_test_wait(50); } } } @@ -86,10 +85,10 @@ void test_hover_delete(void) lv_obj_set_size(btn, 200, 100); lv_test_mouse_move_to(i * 10, 50); - lv_test_indev_wait(50); + lv_test_wait(50); lv_obj_delete(btn); /*No crash while deleting the hovered button*/ - lv_test_indev_wait(50); + lv_test_wait(50); } } diff --git a/tests/src/test_cases/test_indev_reset.c b/tests/src/test_cases/test_indev_reset.c index 610872de6..ef07f521d 100644 --- a/tests/src/test_cases/test_indev_reset.c +++ b/tests/src/test_cases/test_indev_reset.c @@ -1,6 +1,5 @@ #if LV_BUILD_TEST #include "../lvgl.h" -#include "../lv_test_indev.h" #include "unity/unity.h" static uint32_t indev_reset_count = 0; @@ -43,15 +42,15 @@ void test_indev_wait_release(void) lv_test_mouse_move_to(200, 200); lv_test_mouse_press(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_by(-20, 0); lv_test_mouse_press(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_by(-20, 0); lv_test_mouse_press(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_release(); diff --git a/tests/src/test_cases/test_indev_wait_release.c b/tests/src/test_cases/test_indev_wait_release.c index 116f4fb9b..a573cb91d 100644 --- a/tests/src/test_cases/test_indev_wait_release.c +++ b/tests/src/test_cases/test_indev_wait_release.c @@ -1,6 +1,5 @@ #if LV_BUILD_TEST #include "../lvgl.h" -#include "../lv_test_indev.h" #include "unity/unity.h" void setUp(void) @@ -40,18 +39,18 @@ void test_indev_wait_release(void) lv_obj_add_event_cb(btn, event_cb, LV_EVENT_ALL, &pressed_count); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_to(50, 50); lv_test_mouse_press(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_press(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); TEST_ASSERT_EQUAL_UINT32(2, pressed_count); } diff --git a/tests/src/test_cases/test_observer.c b/tests/src/test_cases/test_observer.c index a25c54a7f..ebbf0e0d4 100644 --- a/tests/src/test_cases/test_observer.c +++ b/tests/src/test_cases/test_observer.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" static uint32_t observer_called = 0; @@ -771,11 +770,11 @@ void test_observer_arc_value(void) lv_obj_update_layout(obj); lv_test_mouse_release(); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_move_to(65, 10); lv_test_mouse_press(); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_release(); TEST_ASSERT_EQUAL(50, lv_arc_get_value(obj)); @@ -797,15 +796,15 @@ void test_observer_slider_value(void) lv_obj_update_layout(obj); lv_test_mouse_release(); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_move_to(65, 10); lv_test_mouse_press(); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_move_to(75, 10); lv_test_mouse_press(); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_release(); TEST_ASSERT_EQUAL(29, lv_slider_get_value(obj)); diff --git a/tests/src/test_cases/widgets/test_animimg.c b/tests/src/test_cases/widgets/test_animimg.c index 9f501288f..f778a3eb8 100644 --- a/tests/src/test_cases/widgets/test_animimg.c +++ b/tests/src/test_cases/widgets/test_animimg.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" LV_IMAGE_DECLARE(test_animimg001); LV_IMAGE_DECLARE(test_animimg002); diff --git a/tests/src/test_cases/widgets/test_arc.c b/tests/src/test_cases/widgets/test_arc.c index ef82688ab..b4d059b1a 100644 --- a/tests/src/test_cases/widgets/test_arc.c +++ b/tests/src/test_cases/widgets/test_arc.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" /* This function runs before each test */ void setUp(void); @@ -210,12 +209,12 @@ void test_arc_click_sustained_from_start_to_end_does_not_set_value_to_max(void) /* Click close to start angle */ event_cnt = 0; lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_to(376, 285); lv_test_mouse_press(); - lv_test_indev_wait(500); + lv_test_wait(500); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); TEST_ASSERT_EQUAL_UINT32(1, event_cnt); TEST_ASSERT_EQUAL_INT32(lv_arc_get_min_value(arc), lv_arc_get_value(arc)); @@ -224,14 +223,14 @@ void test_arc_click_sustained_from_start_to_end_does_not_set_value_to_max(void) event_cnt = 0; lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_to(376, 285); lv_test_mouse_press(); - lv_test_indev_wait(500); + lv_test_wait(500); lv_test_mouse_move_to(415, 281); - lv_test_indev_wait(500); + lv_test_wait(500); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); TEST_ASSERT_EQUAL_UINT32(1, event_cnt); TEST_ASSERT_EQUAL_INT32(lv_arc_get_min_value(arc), lv_arc_get_value(arc)); @@ -269,12 +268,12 @@ void test_two_overlapping_arcs_can_be_interacted_independently(void) // Click on the position of the first arc (center) lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_to(400, 195); lv_test_mouse_press(); - lv_test_indev_wait(500); + lv_test_wait(500); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); // Verify that the event callback was called for the first arc TEST_ASSERT_EQUAL_UINT32(0, event_cnt); @@ -282,12 +281,12 @@ void test_two_overlapping_arcs_can_be_interacted_independently(void) // click on the position of the second arc (center) lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); lv_test_mouse_move_to(400, 285); lv_test_mouse_press(); - lv_test_indev_wait(500); + lv_test_wait(500); lv_test_mouse_release(); - lv_test_indev_wait(50); + lv_test_wait(50); // Verify that the event callback was called for the second arc TEST_ASSERT_EQUAL_UINT32(1, event_cnt); diff --git a/tests/src/test_cases/widgets/test_bar.c b/tests/src/test_cases/widgets/test_bar.c index a6fa8f58f..6256bbcd5 100644 --- a/tests/src/test_cases/widgets/test_bar.c +++ b/tests/src/test_cases/widgets/test_bar.c @@ -4,8 +4,6 @@ #include "unity/unity.h" -#include "lv_test_indev.h" - static lv_obj_t * g_active_screen = NULL; static lv_obj_t * g_bar = NULL; @@ -66,7 +64,7 @@ void test_bar_should_update_indicator_right_coordinate_based_on_bar_value(void) lv_bar_set_value(g_bar, bar_value, LV_ANIM_OFF); /* FIXME: Remove wait */ - lv_test_indev_wait(50); + lv_test_wait(50); int32_t actual_coord = lv_area_get_width(&bar_ptr->indic_area); @@ -120,7 +118,7 @@ void test_bar_rtl_should_update_indicator_left_coordinate_based_on_bar_value(voi lv_obj_set_style_base_dir(g_bar, LV_BASE_DIR_RTL, 0); /* FIXME: Remove wait */ - lv_test_indev_wait(50); + lv_test_wait(50); int32_t actual_coord = bar_ptr->indic_area.x1; @@ -219,7 +217,7 @@ void test_bar_indicator_area_should_get_smaller_when_padding_is_increased(void) int32_t original_width = 0u; lv_bar_set_value(g_bar, 50, LV_ANIM_OFF); - lv_test_indev_wait(50); + lv_test_wait(50); original_width = lv_area_get_width(&bar_ptr->indic_area); original_height = lv_area_get_height(&bar_ptr->indic_area); @@ -235,7 +233,7 @@ void test_bar_indicator_area_should_get_smaller_when_padding_is_increased(void) /* Notify LVGL of style change */ lv_obj_report_style_change(&bar_style); - lv_test_indev_wait(50); + lv_test_wait(50); new_height = lv_area_get_height(&bar_ptr->indic_area); new_width = lv_area_get_width(&bar_ptr->indic_area); @@ -307,13 +305,13 @@ void test_bar_indicator_should_be_drawn_towards_the_min_range_side_after_setting /* Set bar value to 1, so it gets drawn at the middle of the bar */ lv_bar_set_value(g_bar, 1, LV_ANIM_OFF); - lv_test_indev_wait(50); + lv_test_wait(50); int32_t original_pos = bar_ptr->indic_area.x1; /* Set bar to a more negative value */ lv_bar_set_value(g_bar, -50, LV_ANIM_OFF); - lv_test_indev_wait(50); + lv_test_wait(50); int32_t final_pos = bar_ptr->indic_area.x1; diff --git a/tests/src/test_cases/widgets/test_btnmatrix.c b/tests/src/test_cases/widgets/test_btnmatrix.c index dbfb1b9cd..59e508f6c 100644 --- a/tests/src/test_cases/widgets/test_btnmatrix.c +++ b/tests/src/test_cases/widgets/test_btnmatrix.c @@ -1,7 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" #include "../../lvgl_private.h" -#include "lv_test_indev.h" #include "unity/unity.h" static lv_obj_t * active_screen = NULL; @@ -393,7 +392,7 @@ void test_button_matrix_pressing_event_works(void) * This is done to increase code coverage. */ btnmObj->btn_id_sel = 3; /* Send a dummy lv_indev_t object as param to avoid crashing during build. */ - lv_obj_send_event(btnm, LV_EVENT_PRESSING, lv_test_mouse_indev); + lv_obj_send_event(btnm, LV_EVENT_PRESSING, lv_test_indev_get_indev(LV_INDEV_TYPE_POINTER)); TEST_ASSERT_TRUE(event_triggered); } diff --git a/tests/src/test_cases/widgets/test_checkbox.c b/tests/src/test_cases/widgets/test_checkbox.c index cdfeed51f..31d532c76 100644 --- a/tests/src/test_cases/widgets/test_checkbox.c +++ b/tests/src/test_cases/widgets/test_checkbox.c @@ -4,9 +4,6 @@ #include "unity/unity.h" -#include "lv_test_helpers.h" -#include "lv_test_indev.h" - void test_checkbox_creation_successful(void); void test_checkbox_should_call_event_handler_on_click_when_enabled(void); void test_checkbox_should_have_default_text_when_created(void); diff --git a/tests/src/test_cases/widgets/test_dropdown.c b/tests/src/test_cases/widgets/test_dropdown.c index 2dedafebd..9cdbf0f48 100644 --- a/tests/src/test_cases/widgets/test_dropdown.c +++ b/tests/src/test_cases/widgets/test_dropdown.c @@ -1,9 +1,7 @@ #if LV_BUILD_TEST #include "../lvgl.h" #include "../../lvgl_private.h" - #include "unity/unity.h" -#include "lv_test_indev.h" #include void setUp(void) @@ -165,7 +163,7 @@ void test_dropdown_keypad(void) lv_obj_clean(lv_screen_active()); lv_group_t * g = lv_group_create(); - lv_indev_set_group(lv_test_keypad_indev, g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_KEYPAD), g); lv_obj_t * dd1 = lv_dropdown_create(lv_screen_active()); lv_obj_set_pos(dd1, 20, 20); @@ -258,7 +256,7 @@ void test_dropdown_keypad(void) TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1)); TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd2)); - lv_indev_set_group(lv_test_keypad_indev, NULL); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_KEYPAD), NULL); lv_group_delete(g); } @@ -267,7 +265,7 @@ void test_dropdown_encoder(void) lv_obj_clean(lv_screen_active()); lv_group_t * g = lv_group_create(); - lv_indev_set_group(lv_test_encoder_indev, g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_ENCODER), g); lv_obj_t * dd1 = lv_dropdown_create(lv_screen_active()); lv_obj_set_pos(dd1, 20, 20); @@ -302,9 +300,9 @@ void test_dropdown_encoder(void) lv_test_encoder_click(); lv_test_encoder_turn(2); lv_test_encoder_press(); - lv_test_indev_wait(1000); //Long press + lv_test_wait(1000); //Long press lv_test_encoder_release(); - lv_test_indev_wait(50); + lv_test_wait(50); TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1)); TEST_ASSERT_EQUAL(4, lv_dropdown_get_selected(dd1)); TEST_ASSERT_EQUAL(2, event_cnt); @@ -314,7 +312,7 @@ void test_dropdown_encoder(void) TEST_ASSERT_FALSE(lv_dropdown_is_open(dd1)); TEST_ASSERT_TRUE(lv_dropdown_is_open(dd2)); - lv_indev_set_group(lv_test_encoder_indev, NULL); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_ENCODER), NULL); lv_group_delete(g); } diff --git a/tests/src/test_cases/widgets/test_label.c b/tests/src/test_cases/widgets/test_label.c index 4e4acdd33..cfd663f4d 100644 --- a/tests/src/test_cases/widgets/test_label.c +++ b/tests/src/test_cases/widgets/test_label.c @@ -630,11 +630,12 @@ static void scroll_next_step(lv_obj_t * label1, lv_obj_t * label2, const char * { lv_label_set_text(label1, (idx % 2) == 0 ? text1 : text2); lv_label_set_text(label2, (idx % 2) == 0 ? text1 : text2); - lv_test_wait(783); /*Use an odd delay*/ char buf[128]; lv_snprintf(buf, sizeof(buf), "widgets/label_scroll_%d.png", idx); TEST_ASSERT_EQUAL_SCREENSHOT(buf); + + lv_test_wait(783); /*Use an odd delay*/ } void test_label_scroll_mid_update(void) @@ -646,18 +647,18 @@ void test_label_scroll_mid_update(void) lv_obj_t * label1 = lv_label_create(lv_screen_active()); lv_label_set_long_mode(label1, LV_LABEL_LONG_MODE_SCROLL); - lv_label_set_text(label1, text1), - lv_obj_set_width(label1, 150); + lv_label_set_text(label1, text1); + lv_obj_set_width(label1, 150); lv_obj_set_pos(label1, 10, 10); lv_obj_t * label2 = lv_label_create(lv_screen_active()); lv_label_set_long_mode(label2, LV_LABEL_LONG_MODE_SCROLL_CIRCULAR); - lv_label_set_text(label2, text1), - lv_obj_set_width(label2, 150); + lv_label_set_text(label2, text1); + lv_obj_set_width(label2, 150); lv_obj_set_pos(label2, 10, 80); uint32_t i; - for(i = 0; i < 15; i++) { + for(i = 0; i < 20; i++) { scroll_next_step(label1, label2, text1, text2, i); } } diff --git a/tests/src/test_cases/widgets/test_lottie.c b/tests/src/test_cases/widgets/test_lottie.c index 72ce2e312..4c81ffa55 100644 --- a/tests/src/test_cases/widgets/test_lottie.c +++ b/tests/src/test_cases/widgets/test_lottie.c @@ -2,9 +2,9 @@ #include "../lvgl.h" #include "unity/unity.h" -#include "lv_test_helpers.h" -static uint32_t buf[CANVAS_WIDTH_TO_STRIDE(100, 4) * 100 + LV_DRAW_BUF_ALIGN]; + +static uint32_t buf[LV_TEST_WIDTH_TO_STRIDE(100, 4) * 100 + LV_DRAW_BUF_ALIGN]; extern const uint8_t test_lottie_approve[]; extern const size_t test_lottie_approve_size; @@ -36,18 +36,18 @@ void test_lottie_simple(void) TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_1.png"); /*Wait a little*/ - lv_test_wait(200); + lv_test_fast_forward(200); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); /*Should be the last frame*/ - lv_test_wait(750); + lv_test_fast_forward(750); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_3.png"); /*Setting a source should reset the animation*/ lv_lottie_set_src_data(lottie, test_lottie_approve, test_lottie_approve_size); /*Should reset automatically*/ - lv_test_wait(200); + lv_test_fast_forward(200); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); } @@ -60,24 +60,24 @@ void test_lottie_load_from_file(void) TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_1.png"); /*Wait a little*/ - lv_test_wait(200); + lv_test_fast_forward(200); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); /*Should be the last frame*/ - lv_test_wait(750); + lv_test_fast_forward(750); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_3.png"); /*Setting a source should reset the animation*/ lv_lottie_set_src_data(lottie, test_lottie_approve, test_lottie_approve_size); /*Should reset automatically*/ - lv_test_wait(200); + lv_test_fast_forward(200); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); } void test_lottie_missing_settings(void) { - uint32_t tmp_buf[CANVAS_WIDTH_TO_STRIDE(100, 4) * 100 + LV_DRAW_BUF_ALIGN]; + uint32_t tmp_buf[LV_TEST_WIDTH_TO_STRIDE(100, 4) * 100 + LV_DRAW_BUF_ALIGN]; lv_obj_t * lottie1 = lv_lottie_create(lv_screen_active()); lv_lottie_set_buffer(lottie1, 100, 100, lv_draw_buf_align(tmp_buf, LV_COLOR_FORMAT_ARGB8888)); @@ -95,7 +95,7 @@ void test_lottie_missing_settings(void) lv_lottie_set_buffer(lottie2, 100, 100, lv_draw_buf_align(buf, LV_COLOR_FORMAT_ARGB8888)); lv_obj_center(lottie2); - lv_test_wait(950); + lv_test_fast_forward(950); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_3.png"); } @@ -107,14 +107,14 @@ void test_lottie_rescale(void) lv_obj_center(lottie); /*Wait a little*/ - lv_test_wait(200); + lv_test_fast_forward(200); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); lv_lottie_set_buffer(lottie, 50, 50, lv_draw_buf_align(buf, LV_COLOR_FORMAT_ARGB8888)); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2_small.png"); /*Should be the last frame*/ - lv_test_wait(750); + lv_test_fast_forward(750); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_3_small.png"); } @@ -126,7 +126,7 @@ void test_lottie_non_uniform_shape(void) lv_lottie_set_src_data(lottie, test_lottie_approve, test_lottie_approve_size); lv_obj_center(lottie); - lv_test_wait(950); + lv_test_fast_forward(950); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_4.png"); } @@ -140,7 +140,7 @@ void test_lottie_memory_leak(void) lv_lottie_set_buffer(lottie, 100, 100, lv_draw_buf_align(buf, LV_COLOR_FORMAT_ARGB8888)); lv_lottie_set_src_data(lottie, test_lottie_approve, test_lottie_approve_size); lv_obj_center(lottie); - lv_test_wait(753 * i); /*Render a random frame*/ + lv_test_fast_forward(753 * i); /*Render a random frame*/ lv_timer_handler(); lv_obj_delete(lottie); } @@ -155,18 +155,18 @@ void test_lottie_no_jump_when_visible_again(void) lv_obj_center(lottie); /*Wait a little*/ - lv_test_wait(200); + lv_test_fast_forward(200); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); lv_obj_add_flag(lottie, LV_OBJ_FLAG_HIDDEN); - lv_test_wait(300); + lv_test_fast_forward(300); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_1.png"); /*Empty screen*/ /*Should be on the same frame*/ lv_obj_clear_flag(lottie, LV_OBJ_FLAG_HIDDEN); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_2.png"); - lv_test_wait(750); + lv_test_fast_forward(750); TEST_ASSERT_EQUAL_SCREENSHOT("widgets/lottie_3.png"); } diff --git a/tests/src/test_cases/widgets/test_msgbox.c b/tests/src/test_cases/widgets/test_msgbox.c index a2f42339c..fe9157ed0 100644 --- a/tests/src/test_cases/widgets/test_msgbox.c +++ b/tests/src/test_cases/widgets/test_msgbox.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" /* This function runs before each test */ void setUp(void); diff --git a/tests/src/test_cases/widgets/test_obj_flags.c b/tests/src/test_cases/widgets/test_obj_flags.c index 88f6d7846..fc5a0624a 100644 --- a/tests/src/test_cases/widgets/test_obj_flags.c +++ b/tests/src/test_cases/widgets/test_obj_flags.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" void setUp(void) { diff --git a/tests/src/test_cases/widgets/test_roller.c b/tests/src/test_cases/widgets/test_roller.c index 956ec9813..089a82bf6 100644 --- a/tests/src/test_cases/widgets/test_roller.c +++ b/tests/src/test_cases/widgets/test_roller.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" #include #define OPTION_BUFFER_SZ (20U) @@ -32,13 +31,13 @@ void setUp(void) lv_roller_set_options(roller_mouse, default_roller_options, LV_ROLLER_MODE_NORMAL); g = lv_group_create(); - lv_indev_set_group(lv_test_keypad_indev, g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_KEYPAD), g); encoder_g = lv_group_create(); - lv_indev_set_group(lv_test_encoder_indev, encoder_g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_ENCODER), encoder_g); mouse_g = lv_group_create(); - lv_indev_set_group(lv_test_mouse_indev, mouse_g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_POINTER), mouse_g); lv_group_add_obj(g, roller); lv_group_add_obj(encoder_g, roller_infinite); @@ -149,7 +148,7 @@ void test_roller_keypad_events(void) int16_t expected_index = 1; int16_t actual_index = 0; - lv_test_indev_wait(20); + lv_test_wait(20); return; diff --git a/tests/src/test_cases/widgets/test_slider.c b/tests/src/test_cases/widgets/test_slider.c index 133a93ff1..069c69328 100644 --- a/tests/src/test_cases/widgets/test_slider.c +++ b/tests/src/test_cases/widgets/test_slider.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" static lv_obj_t * active_screen = NULL; static lv_obj_t * slider = NULL; @@ -25,7 +24,7 @@ void setUp(void) lv_slider_set_mode(sliderSymmetricalMode, LV_SLIDER_MODE_SYMMETRICAL); g = lv_group_create(); - lv_indev_set_group(lv_test_encoder_indev, g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_ENCODER), g); } void tearDown(void) @@ -116,7 +115,7 @@ void test_slider_range_mode_should_not_leave_edit_mode_if_released_with_no_left_ lv_group_set_editing(g, true); lv_test_encoder_release(); - lv_test_indev_wait(50); + lv_test_wait(50); /* Always executed when handling LV_EVENT_RELEASED or * LV_EVENT_PRESS_LOST */ diff --git a/tests/src/test_cases/widgets/test_spinbox.c b/tests/src/test_cases/widgets/test_spinbox.c index c404203e0..55efcba42 100644 --- a/tests/src/test_cases/widgets/test_spinbox.c +++ b/tests/src/test_cases/widgets/test_spinbox.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" static lv_obj_t * active_screen = NULL; static lv_obj_t * spinbox_negative_min_range = NULL; @@ -27,7 +26,7 @@ void setUp(void) lv_spinbox_set_range(spinbox_zero_min_range, SPINBOX_ZERO_MIN_RANGE_VALUE, SPINBOX_NEGATIVE_MAX_RANGE_VALUE); g = lv_group_create(); - lv_indev_set_group(lv_test_encoder_indev, g); + lv_indev_set_group(lv_test_indev_get_indev(LV_INDEV_TYPE_ENCODER), g); } void tearDown(void) diff --git a/tests/src/test_cases/widgets/test_switch.c b/tests/src/test_cases/widgets/test_switch.c index 8ffa58731..4569fcbc7 100644 --- a/tests/src/test_cases/widgets/test_switch.c +++ b/tests/src/test_cases/widgets/test_switch.c @@ -4,9 +4,6 @@ #include "unity/unity.h" -#include "lv_test_helpers.h" -#include "lv_test_indev.h" - #define SWITCHES_CNT 10 uint8_t value_changed_event_cnt = 0; @@ -75,14 +72,14 @@ void test_switch_animation(void) /* Trigger animation */ mouse_click_on_switch(); /* Wait some time */ - lv_test_indev_wait(50); + lv_test_wait(50); int32_t checked_anim_state = anim_sw->anim_state; TEST_ASSERT_GREATER_THAN(initial_anim_state, checked_anim_state); TEST_ASSERT(lv_obj_has_state(sw, LV_STATE_CHECKED)); mouse_click_on_switch(); - lv_test_indev_wait(50); + lv_test_wait(50); TEST_ASSERT_LESS_THAN(checked_anim_state, anim_sw->anim_state); TEST_ASSERT_FALSE(lv_obj_has_state(sw, LV_STATE_CHECKED)); diff --git a/tests/src/test_cases/widgets/test_tabview.c b/tests/src/test_cases/widgets/test_tabview.c index e31fff1f1..69517b9ea 100644 --- a/tests/src/test_cases/widgets/test_tabview.c +++ b/tests/src/test_cases/widgets/test_tabview.c @@ -3,7 +3,6 @@ #include "../../lvgl_private.h" #include "unity/unity.h" -#include "lv_test_indev.h" void setUp(void); void tearDown(void); diff --git a/tests/src/test_cases/xml/test_xml_event.c b/tests/src/test_cases/xml/test_xml_event.c index cb90ce34a..9c7335c1a 100644 --- a/tests/src/test_cases/xml/test_xml_event.c +++ b/tests/src/test_cases/xml/test_xml_event.c @@ -2,7 +2,6 @@ #include "../lvgl.h" #include "unity/unity.h" -#include "lv_test_indev.h" #include void setUp(void) @@ -65,7 +64,7 @@ void test_xml_event_call_function_attr(void) lv_test_mouse_click_at(30, 20); TEST_ASSERT_EQUAL(3, cnt); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_click_at(30, 20); TEST_ASSERT_EQUAL(6, cnt); } @@ -91,7 +90,7 @@ void test_xml_event_call_function_component(void) lv_test_mouse_click_at(30, 10); TEST_ASSERT_EQUAL(3, cnt); - lv_test_indev_wait(100); + lv_test_wait(100); lv_test_mouse_click_at(30, 10); TEST_ASSERT_EQUAL(6, cnt); } diff --git a/tests/unity/unity_support.h b/tests/unity/unity_support.h index 6bd025d9b..daae78c79 100644 --- a/tests/unity/unity_support.h +++ b/tests/unity/unity_support.h @@ -8,10 +8,6 @@ extern "C" { #include #include "../../lvgl.h" -#include "../src/lv_test_helpers.h" - -bool lv_test_assert_image_eq(const char * fn_ref); - #if LV_COLOR_DEPTH != 32 # define TEST_ASSERT_EQUAL_SCREENSHOT(path) TEST_IGNORE_MESSAGE("Requires LV_COLOR_DEPTH 32"); @@ -21,14 +17,14 @@ bool lv_test_assert_image_eq(const char * fn_ref); # define TEST_ASSERT_EQUAL_SCREENSHOT(path) if(LV_HOR_RES != 800 || LV_VER_RES != 480) { \ TEST_IGNORE_MESSAGE("Requires 800x480 resolution"); \ } else { \ - TEST_ASSERT_MESSAGE(lv_test_assert_image_eq(path), path); \ + TEST_ASSERT_MESSAGE(lv_test_screenshot_compare(path), path); \ } # define TEST_ASSERT_EQUAL_SCREENSHOT_MESSAGE(path, msg) if(LV_HOR_RES != 800 || LV_VER_RES != 480) { \ TEST_PRINTF(msg); \ TEST_IGNORE_MESSAGE("Requires 800x480 resolution"); \ } else { \ - TEST_ASSERT_MESSAGE(lv_test_assert_image_eq(path), msg); \ + TEST_ASSERT_MESSAGE(lv_test_screenshot_compare(path), msg); \ } #endif