diff --git a/src/misc/lv_matrix.c b/src/misc/lv_matrix.c index 62a9584812..a2455dac2a 100644 --- a/src/misc/lv_matrix.c +++ b/src/misc/lv_matrix.c @@ -198,12 +198,21 @@ lv_point_precise_t lv_matrix_transform_precise_point(const lv_matrix_t * matrix, lv_area_t lv_matrix_transform_area(const lv_matrix_t * matrix, const lv_area_t * area) { + if(lv_matrix_is_identity(matrix)) { + return *area; + } + + /** + * Since lv_area_t will subtract 1px when calculating width and height, + * this will affect the matrix transformation calculation, so +1px is needed as compensation, + * and the compensation value is subtracted after the calculation is completed + */ lv_area_t res; lv_point_precise_t p[4] = { {area->x1, area->y1}, - {area->x1, area->y2}, - {area->x2, area->y1}, - {area->x2, area->y2}, + {area->x1, area->y2 + 1}, + {area->x2 + 1, area->y1}, + {area->x2 + 1, area->y2 + 1}, }; p[0] = lv_matrix_transform_precise_point(matrix, &p[0]); p[1] = lv_matrix_transform_precise_point(matrix, &p[1]); @@ -211,9 +220,9 @@ lv_area_t lv_matrix_transform_area(const lv_matrix_t * matrix, const lv_area_t * p[3] = lv_matrix_transform_precise_point(matrix, &p[3]); res.x1 = (int32_t)(LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x)); - res.x2 = (int32_t)(LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x)); + res.x2 = (int32_t)(LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x)) - 1; res.y1 = (int32_t)(LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y)); - res.y2 = (int32_t)(LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y)); + res.y2 = (int32_t)(LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y)) - 1; return res; } diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp32.png index 6468149ebc..9a85eccf42 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp64.png index b059ff6ff2..15da2cee70 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_0_during_rendering.lp64.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp32.png index c94ec89546..7bfa7457ac 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp64.png index ef55914ce7..87ee9bf078 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_180_during_rendering.lp64.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp32.png index 1b9bd96047..bbfde8264f 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp64.png index 9fa06ff640..d9e8efb41d 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_270_during_rendering.lp64.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp32.png index ca5c61efab..2da9d80178 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp64.png index b0f9dc7d33..b0d905b535 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_lines_disp_rotation_90_during_rendering.lp64.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp32.png index 941b733bf4..c7fa921bff 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp64.png index 02f0ee56d1..7412619195 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_180_during_rendering.lp64.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp32.png index fff85b673b..29c6cbbef8 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp64.png index 66a64a1cca..96ae9cdfc0 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_270_during_rendering.lp64.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp32.png b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp32.png index ca176ae989..ee19f4c32c 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp32.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp32.png differ diff --git a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp64.png b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp64.png index 4213f6f8fd..11989db8c2 100644 Binary files a/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp64.png and b/tests/ref_imgs_vg_lite/draw/vector_draw_shapes_disp_rotation_90_during_rendering.lp64.png differ diff --git a/tests/src/test_cases/test_display.c b/tests/src/test_cases/test_display.c index bc314b80e0..6eed093a1e 100644 --- a/tests/src/test_cases/test_display.c +++ b/tests/src/test_cases/test_display.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" /*Bypassing resolution check*/ @@ -132,6 +133,45 @@ void test_get_invalidated_drawbuf_size_i1_partial() exec_invalidated_drawbuf_size_test(&test_set); } +#if LV_DRAW_TRANSFORM_USE_MATRIX +static void test_matrix_transform_area(lv_display_t * display) +{ + lv_area_t ori_area = { 0 }; + lv_area_set_width(&ori_area, 100); + lv_area_set_height(&ori_area, 100); + + lv_matrix_t matrix; + lv_matrix_identity(&matrix); + + const int32_t hor_res = lv_display_get_original_horizontal_resolution(display); + const int32_t ver_res = lv_display_get_original_vertical_resolution(display); + + switch(lv_display_get_rotation(display)) { + case LV_DISPLAY_ROTATION_0: + break; + case LV_DISPLAY_ROTATION_90: + lv_matrix_rotate(&matrix, 270); + lv_matrix_translate(&matrix, -ver_res, 0); + break; + case LV_DISPLAY_ROTATION_180: + lv_matrix_rotate(&matrix, 180); + lv_matrix_translate(&matrix, -hor_res, -ver_res); + break; + case LV_DISPLAY_ROTATION_270: + lv_matrix_rotate(&matrix, 90); + lv_matrix_translate(&matrix, 0, -hor_res); + break; + } + + lv_area_t disp_area = ori_area; + lv_display_rotate_area(display, &disp_area); + + lv_area_t matrix_area = lv_matrix_transform_area(&matrix, &ori_area); + + TEST_ASSERT_TRUE(lv_area_is_equal(&disp_area, &matrix_area)); +} +#endif + void test_display_matrix_rotation(void) { #if LV_DRAW_TRANSFORM_USE_MATRIX @@ -145,23 +185,28 @@ void test_display_matrix_rotation(void) TEST_ASSERT_TRUE(lv_display_get_matrix_rotation(disp)); lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_0); + test_matrix_transform_area(disp); lv_label_set_text(label, "Rotation: 0 degrees"); TEST_DISPLAY_ASSERT_EQUAL_SCREENSHOT("display_matrix_rotation_0.png"); lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_90); + test_matrix_transform_area(disp); lv_label_set_text(label, "Rotation: 90 degrees"); TEST_DISPLAY_ASSERT_EQUAL_SCREENSHOT("display_matrix_rotation_90.png"); lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_180); + test_matrix_transform_area(disp); lv_label_set_text(label, "Rotation: 180 degrees"); TEST_DISPLAY_ASSERT_EQUAL_SCREENSHOT("display_matrix_rotation_180.png"); lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_270); + test_matrix_transform_area(disp); lv_label_set_text(label, "Rotation: 270 degrees"); TEST_DISPLAY_ASSERT_EQUAL_SCREENSHOT("display_matrix_rotation_270.png"); lv_display_set_matrix_rotation(disp, false); lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_0); + test_matrix_transform_area(disp); lv_label_set_text(label, "Rotation: 0 degrees"); TEST_DISPLAY_ASSERT_EQUAL_SCREENSHOT("display_matrix_rotation_0.png"); #else