diff --git a/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/src/draw/vg_lite/lv_draw_vg_lite_fill.c index 24fbd24f1..20225ef9d 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_fill.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_fill.c @@ -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); diff --git a/src/draw/vg_lite/lv_draw_vg_lite_triangle.c b/src/draw/vg_lite/lv_draw_vg_lite_triangle.c index 5508a7595..bafbb50e8 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_triangle.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_triangle.c @@ -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); diff --git a/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/src/draw/vg_lite/lv_draw_vg_lite_vector.c index 002f16bf1..3a5416f40 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_vector.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_vector.c @@ -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); diff --git a/src/draw/vg_lite/lv_vg_lite_grad.c b/src/draw/vg_lite/lv_vg_lite_grad.c index 2d7a6003a..34d1ce511 100644 --- a/src/draw/vg_lite/lv_vg_lite_grad.c +++ b/src/draw/vg_lite/lv_vg_lite_grad.c @@ -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); diff --git a/src/draw/vg_lite/lv_vg_lite_grad.h b/src/draw/vg_lite/lv_vg_lite_grad.h index 491b60b2c..d709ade46 100644 --- a/src/draw/vg_lite/lv_vg_lite_grad.h +++ b/src/draw/vg_lite/lv_vg_lite_grad.h @@ -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);