fix(vg_lite): fix vector rendering fill dsc matrix not taking effect (#5728)

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
This commit is contained in:
_VIFEXTech
2024-02-24 22:03:05 +08:00
committed by GitHub
parent d10319ea41
commit ba04e73701
5 changed files with 46 additions and 24 deletions

View File

@@ -84,12 +84,14 @@ void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t *
LV_VG_LITE_ASSERT_PATH(vg_lite_path);
if(dsc->grad.dir != LV_GRAD_DIR_NONE) {
vg_lite_matrix_t grad_matrix;
lv_vg_lite_grad_area_to_matrix(&grad_matrix, coords, dsc->grad.dir);
lv_vg_lite_draw_linear_grad(
u,
&u->target_buffer,
vg_lite_path,
coords,
&dsc->grad,
&grad_matrix,
&matrix,
VG_LITE_FILL_EVEN_ODD,
VG_LITE_BLEND_SRC_OVER);

View File

@@ -77,12 +77,14 @@ void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle
lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix);
if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) {
vg_lite_matrix_t grad_matrix;
lv_vg_lite_grad_area_to_matrix(&grad_matrix, &tri_area, dsc->bg_grad.dir);
lv_vg_lite_draw_linear_grad(
u,
&u->target_buffer,
vg_lite_path,
&tri_area,
&dsc->bg_grad,
&grad_matrix,
&matrix,
VG_LITE_FILL_EVEN_ODD,
VG_LITE_BLEND_SRC_OVER);

View File

@@ -190,19 +190,24 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
break;
case LV_VECTOR_DRAW_STYLE_GRADIENT: {
/* draw gradient */
lv_area_t grad_area;
lv_area_set(&grad_area, (int32_t)min_x, (int32_t)min_y, (int32_t)max_x, (int32_t)max_y);
lv_vector_gradient_style_t style = dsc->fill_dsc.gradient.style;
vg_lite_gradient_spreadmode_t spreadmode = lv_spread_to_vg(dsc->fill_dsc.gradient.spread);
LV_UNUSED(spreadmode);
lv_matrix_t m = dsc->matrix;
lv_matrix_translate(&m, min_x, min_y);
lv_matrix_multiply(&m, &dsc->fill_dsc.matrix);
vg_lite_matrix_t grad_matrix;
lv_matrix_to_vg(&grad_matrix, &m);
if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) {
lv_vg_lite_draw_linear_grad(
u,
&u->target_buffer,
vg_path,
&grad_area,
&dsc->fill_dsc.gradient.grad,
&grad_matrix,
&matrix,
fill,
blend);

View File

@@ -75,20 +75,44 @@ void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u)
lv_cache_destroy(u->grad_cache, NULL);
}
void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir)
{
LV_ASSERT_NULL(grad_matrix);
LV_ASSERT_NULL(area);
vg_lite_identity(grad_matrix);
vg_lite_translate(area->x1, area->y1, grad_matrix);
switch(dir) {
case LV_GRAD_DIR_VER:
vg_lite_scale(1, lv_area_get_height(area) / 256.0f, grad_matrix);
vg_lite_rotate(90, grad_matrix);
break;
case LV_GRAD_DIR_HOR:
vg_lite_scale(lv_area_get_width(area) / 256.0f, 1, grad_matrix);
break;
default:
break;
}
}
void lv_vg_lite_draw_linear_grad(
struct _lv_draw_vg_lite_unit_t * u,
vg_lite_buffer_t * buffer,
vg_lite_path_t * path,
const lv_area_t * area,
const lv_grad_dsc_t * grad,
const vg_lite_matrix_t * grad_matrix,
const vg_lite_matrix_t * matrix,
vg_lite_fill_t fill,
vg_lite_blend_t blend)
{
LV_ASSERT_NULL(u);
LV_ASSERT_NULL(buffer);
LV_ASSERT_NULL(path);
LV_ASSERT_NULL(area);
LV_ASSERT_NULL(grad);
LV_ASSERT_NULL(grad_matrix);
LV_ASSERT_NULL(matrix);
LV_PROFILER_BEGIN;
@@ -101,22 +125,9 @@ void lv_vg_lite_draw_linear_grad(
return;
}
vg_lite_matrix_t * grad_matrix = vg_lite_get_grad_matrix(gradient);
vg_lite_identity(grad_matrix);
vg_lite_translate(area->x1, area->y1, grad_matrix);
if(grad->dir == LV_GRAD_DIR_VER) {
vg_lite_scale(1, lv_area_get_height(area) / 256.0f, grad_matrix);
vg_lite_rotate(90, grad_matrix);
}
else if(grad->dir == LV_GRAD_DIR_HOR) {
vg_lite_scale(lv_area_get_width(area) / 256.0f, 1, grad_matrix);
}
else {
LV_LOG_ERROR("Unknown gradient direction: %d", (int)grad->dir);
LV_PROFILER_END;
return;
}
vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(gradient);
LV_ASSERT_NULL(grad_mat_p);
*grad_mat_p = *grad_matrix;
LV_VG_LITE_ASSERT_DEST_BUFFER(buffer);
LV_VG_LITE_ASSERT_SRC_BUFFER(&gradient->image);

View File

@@ -36,12 +36,14 @@ void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u);
void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u);
void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir);
void lv_vg_lite_draw_linear_grad(
struct _lv_draw_vg_lite_unit_t * u,
vg_lite_buffer_t * buffer,
vg_lite_path_t * path,
const lv_area_t * area,
const lv_grad_dsc_t * grad,
const vg_lite_matrix_t * grad_matrix,
const vg_lite_matrix_t * matrix,
vg_lite_fill_t fill,
vg_lite_blend_t blend);