fix(canvas): add the missing D-Cache flush (#8736)

Signed-off-by: FASTSHIFT <vifextech@foxmail.com>
This commit is contained in:
VIFEX
2025-08-25 14:01:22 +08:00
committed by GitHub
parent 43f8763c60
commit 75a24301fa
3 changed files with 23 additions and 0 deletions

View File

@@ -821,6 +821,12 @@ static void blend_mode_cb(lv_obj_t * parent)
LV_DRAW_BUF_DEFINE_STATIC(buf_argb8888, 36, 30, LV_COLOR_FORMAT_ARGB8888);
LV_DRAW_BUF_DEFINE_STATIC(buf_argb8888_premul, 36, 30, LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED);
LV_DRAW_BUF_INIT_STATIC(buf_rgb565);
LV_DRAW_BUF_INIT_STATIC(buf_rgb888);
LV_DRAW_BUF_INIT_STATIC(buf_xrgb8888);
LV_DRAW_BUF_INIT_STATIC(buf_argb8888);
LV_DRAW_BUF_INIT_STATIC(buf_argb8888_premul);
/*The canvas will stay in the top left corner to show the original image*/
lv_obj_t * canvas = lv_canvas_create(lv_screen_active());

View File

@@ -92,6 +92,11 @@ void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf)
LV_ASSERT_OBJ(obj, MY_CLASS);
LV_ASSERT_NULL(draw_buf);
if(!draw_buf->handlers) {
LV_LOG_ERROR("draw_buf has no handlers, maybe not initialized");
return;
}
lv_canvas_t * canvas = (lv_canvas_t *)obj;
canvas->draw_buf = draw_buf;
@@ -365,6 +370,7 @@ void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa)
}
}
lv_draw_buf_flush_cache(canvas->draw_buf, NULL);
lv_obj_invalidate(obj);
}

View File

@@ -46,10 +46,21 @@ void test_canvas_functions_invalidate(void)
TEST_ASSERT(draw_counter == 0);
LV_DRAW_BUF_DEFINE_STATIC(draw_buf, 100, 100, LV_COLOR_FORMAT_NATIVE);
/* test uninitialized draw buffer, it should fail.*/
lv_canvas_set_draw_buf(canvas, &draw_buf);
TEST_ASSERT_NULL(lv_canvas_get_draw_buf(canvas));
TEST_ASSERT_NULL(lv_canvas_get_image(canvas));
TEST_ASSERT_NULL(lv_canvas_get_buf(canvas));
LV_DRAW_BUF_INIT_STATIC(draw_buf);
canvas_draw_buf_reshape(&draw_buf);
lv_canvas_set_draw_buf(canvas, &draw_buf);
TEST_ASSERT_EQUAL_PTR(lv_canvas_get_draw_buf(canvas), &draw_buf);
TEST_ASSERT_EQUAL_PTR(lv_canvas_get_image(canvas), &draw_buf);
TEST_ASSERT_EQUAL_PTR(lv_canvas_get_buf(canvas), draw_buf.unaligned_data);
lv_refr_now(NULL);
TEST_ASSERT(draw_counter == 1);