From a67463db5b816ca3f24457e7fae25aac5559bf26 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 20 Sep 2019 11:03:13 +0200 Subject: [PATCH] lv_bar: mask the gradient indicators --- src/lv_core/lv_style.c | 1 - src/lv_objx/lv_bar.c | 77 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/lv_core/lv_style.c b/src/lv_core/lv_style.c index 92635612a..92619642b 100644 --- a/src/lv_core/lv_style.c +++ b/src/lv_core/lv_style.c @@ -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); diff --git a/src/lv_objx/lv_bar.c b/src/lv_objx/lv_bar.c index 88a6e3329..fdc569e85 100644 --- a/src/lv_objx/lv_bar.c +++ b/src/lv_objx/lv_bar.c @@ -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); } /**