mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-28 07:03:00 +08:00
lv_bar: mask the gradient indicators
This commit is contained in:
parent
2c5dd5f3eb
commit
a67463db5b
@ -135,7 +135,6 @@ void lv_style_init(void)
|
||||
lv_style_plain_color.body.main_color = lv_color_make(0x55, 0x96, 0xd8);
|
||||
lv_style_plain_color.body.grad_color = lv_style_plain_color.body.main_color;
|
||||
|
||||
|
||||
/*Pretty style */
|
||||
lv_style_copy(&lv_style_pretty, &lv_style_plain);
|
||||
lv_style_pretty.text.color = lv_color_make(0x20, 0x20, 0x20);
|
||||
|
@ -502,26 +502,73 @@ static void draw_indic(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mo
|
||||
/*Do not draw a zero length indicator*/
|
||||
if(!sym && indic_length == 0) return;
|
||||
|
||||
lv_area_t mask_area;
|
||||
lv_area_copy(&mask_area, &bar->coords);
|
||||
mask_area.x1 -= style_indic->body.shadow.width;
|
||||
mask_area.y1 -= style_indic->body.shadow.width;
|
||||
mask_area.x2 += style_indic->body.shadow.width;
|
||||
mask_area.y2 += style_indic->body.shadow.width;
|
||||
/* Create a mask to the background.
|
||||
* It would look ugly if the indicator overflows on the rounded corners */
|
||||
lv_area_t mask_bg_area;
|
||||
lv_area_copy(&mask_bg_area, &bar->coords);
|
||||
mask_bg_area.x1 -= style_indic->body.shadow.width;
|
||||
mask_bg_area.y1 -= style_indic->body.shadow.width;
|
||||
mask_bg_area.x2 += style_indic->body.shadow.width;
|
||||
mask_bg_area.y2 += style_indic->body.shadow.width;
|
||||
|
||||
if(style_indic->body.shadow.offset.x > 0) mask_area.x1 += style_indic->body.shadow.offset.x;
|
||||
else mask_area.x2 -= style_indic->body.shadow.offset.x;
|
||||
if(style_indic->body.shadow.offset.x > 0) mask_bg_area.x1 += style_indic->body.shadow.offset.x;
|
||||
else mask_bg_area.x2 -= style_indic->body.shadow.offset.x;
|
||||
|
||||
if(style_indic->body.shadow.offset.y > 0) mask_area.y1 += style_indic->body.shadow.offset.y;
|
||||
else mask_area.y2 -= style_indic->body.shadow.offset.y;
|
||||
if(style_indic->body.shadow.offset.y > 0) mask_bg_area.y1 += style_indic->body.shadow.offset.y;
|
||||
else mask_bg_area.y2 -= style_indic->body.shadow.offset.y;
|
||||
|
||||
lv_draw_mask_param_t mask_bg_param;
|
||||
lv_draw_mask_radius_init(&mask_bg_param, &mask_bg_area,style_indic->body.radius, false);
|
||||
int16_t mask_bg_id = lv_draw_mask_add(&mask_bg_param, NULL);
|
||||
|
||||
/*If the indicator has a gradient along the longed side,
|
||||
* mask out only the current indicator area from the big gradient.*/
|
||||
if((objw > objh && style_indic->body.grad_dir == LV_GRAD_DIR_HOR) ||
|
||||
(objh > objw && style_indic->body.grad_dir == LV_GRAD_DIR_VER)) {
|
||||
|
||||
lv_style_t style_indic_tmp;
|
||||
lv_style_copy(&style_indic_tmp, style_indic);
|
||||
|
||||
/*Draw only the shadow*/
|
||||
style_indic_tmp.body.opa = LV_OPA_TRANSP;
|
||||
style_indic_tmp.body.border.width = 0;
|
||||
lv_draw_rect(&ext->indic_area, clip_area, &style_indic_tmp, opa);
|
||||
|
||||
/*Draw_only the background*/
|
||||
/*Get the max possible indicator area. The gradient should be applied on this*/
|
||||
lv_area_t mask_indic_max_area;
|
||||
lv_area_copy(&mask_indic_max_area, &bar->coords);
|
||||
mask_indic_max_area.x1 += style_indic->body.padding.left;
|
||||
mask_indic_max_area.y1 += style_indic->body.padding.top;
|
||||
mask_indic_max_area.x2 -= style_indic->body.padding.right;
|
||||
mask_indic_max_area.y2 -= style_indic->body.padding.bottom;
|
||||
|
||||
/*Create a mask to the current indicator area. This is see only this part from the whole gradient.*/
|
||||
lv_draw_mask_param_t mask_indic_param;
|
||||
lv_draw_mask_radius_init(&mask_indic_param, &ext->indic_area, style_indic->body.radius, false);
|
||||
int16_t mask_indic_id = lv_draw_mask_add(&mask_indic_param, NULL);
|
||||
|
||||
style_indic_tmp.body.shadow.width = 0;
|
||||
style_indic_tmp.body.opa = style_indic->body.opa;
|
||||
lv_draw_rect(&mask_indic_max_area, clip_area, &style_indic_tmp, opa);
|
||||
|
||||
lv_draw_mask_remove_id(mask_indic_id);
|
||||
|
||||
/*Draw only the border*/
|
||||
style_indic_tmp.body.opa = LV_OPA_TRANSP;
|
||||
style_indic_tmp.body.border.width = style_indic->body.border.width;
|
||||
lv_draw_rect(&ext->indic_area, clip_area, &style_indic_tmp, opa);
|
||||
|
||||
}
|
||||
/*If the gradient is along the short side, simply draw a rectangle.*/
|
||||
else {
|
||||
lv_draw_rect(&ext->indic_area, clip_area, style_indic, opa);
|
||||
}
|
||||
|
||||
lv_draw_mask_remove_id(mask_bg_id);
|
||||
|
||||
lv_draw_mask_param_t mask_param;
|
||||
lv_draw_mask_radius_init(&mask_param, &mask_area,style_indic->body.radius, false);
|
||||
int16_t bg_mask_id = lv_draw_mask_add(&mask_param, NULL);
|
||||
|
||||
lv_draw_rect(&ext->indic_area, clip_area, style_indic, opa);
|
||||
|
||||
lv_draw_mask_remove_id(bg_mask_id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user