1
0
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:
Gabor Kiss-Vamosi 2019-09-20 11:03:13 +02:00
parent 2c5dd5f3eb
commit a67463db5b
2 changed files with 62 additions and 16 deletions

View File

@ -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);

View File

@ -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);
}
/**