Skip to content

Commit

Permalink
fix(vg_lite): fix corner case of bar drawing (#7441)
Browse files Browse the repository at this point in the history
Signed-off-by: pengyiqiang <[email protected]>
Co-authored-by: pengyiqiang <[email protected]>
  • Loading branch information
FASTSHIFT and pengyiqiang authored Dec 11, 2024
1 parent d79fc58 commit 85402e8
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 9 deletions.
50 changes: 41 additions & 9 deletions src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,34 @@ void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_re
* ThorVG does not yet support simulating the VG_LITE_BLEND_DST_IN blend mode,
* and uses software rendering to achieve this
*/
lv_layer_t * target_layer = draw_unit->target_layer;
const lv_area_t * buf_area = &target_layer->buf_area;
lv_area_t clear_area;

lv_draw_buf_t * draw_buf = target_layer->draw_buf;

/*Clear the top part*/
lv_area_set(&clear_area, draw_unit->clip_area->x1, draw_unit->clip_area->y1, draw_unit->clip_area->x2,
dsc->area.y1 - 1);
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
lv_draw_buf_clear(draw_buf, &clear_area);

/*Clear the bottom part*/
lv_area_set(&clear_area, draw_unit->clip_area->x1, dsc->area.y2 + 1, draw_unit->clip_area->x2,
draw_unit->clip_area->y2);
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
lv_draw_buf_clear(draw_buf, &clear_area);

/*Clear the left part*/
lv_area_set(&clear_area, draw_unit->clip_area->x1, dsc->area.y1, dsc->area.x1 - 1, dsc->area.y2);
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
lv_draw_buf_clear(draw_buf, &clear_area);

/*Clear the right part*/
lv_area_set(&clear_area, dsc->area.x2 + 1, dsc->area.y1, draw_unit->clip_area->x2, dsc->area.y2);
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
lv_draw_buf_clear(draw_buf, &clear_area);

lv_draw_sw_mask_radius_param_t param;
lv_draw_sw_mask_radius_init(&param, &dsc->area, dsc->radius, false);

Expand All @@ -74,7 +102,6 @@ void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_re
lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w);
if(res == LV_DRAW_SW_MASK_RES_FULL_COVER) continue;

lv_layer_t * target_layer = draw_unit->target_layer;
lv_color32_t * c32_buf = lv_draw_layer_go_to_xy(target_layer, draw_area.x1 - target_layer->buf_area.x1,
y - target_layer->buf_area.y1);

Expand All @@ -100,15 +127,20 @@ void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_re
/* Using hardware rendering masks */
lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit;

int32_t w = lv_area_get_width(&dsc->area);
int32_t h = lv_area_get_height(&dsc->area);

lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
lv_vg_lite_path_set_bounding_box_area(path, &draw_area);

/* Use rounded rectangles and normal rectangles of the same size to nest the cropped area */
lv_vg_lite_path_append_rect(path, dsc->area.x1, dsc->area.y1, w, h, dsc->radius);
lv_vg_lite_path_append_rect(path, dsc->area.x1, dsc->area.y1, w, h, 0);
lv_vg_lite_path_set_bounding_box_area(path, draw_unit->clip_area);

/* Nesting cropping regions using rounded rectangles and normal rectangles */
lv_vg_lite_path_append_rect(
path,
dsc->area.x1, dsc->area.y1,
lv_area_get_width(&dsc->area), lv_area_get_height(&dsc->area),
dsc->radius);
lv_vg_lite_path_append_rect(
path,
draw_unit->clip_area->x1, draw_unit->clip_area->y1,
lv_area_get_width(draw_unit->clip_area), lv_area_get_height(draw_unit->clip_area),
0);
lv_vg_lite_path_end(path);

vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path);
Expand Down
Binary file modified tests/ref_imgs_vg_lite/widgets/bar_corner_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified tests/ref_imgs_vg_lite/widgets/bar_corner_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified tests/ref_imgs_vg_lite/widgets/bar_corner_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified tests/ref_imgs_vg_lite/widgets/bar_corner_6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 85402e8

Please sign in to comment.