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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user