diff --git a/src/widgets/lv_bar.c b/src/widgets/lv_bar.c index 3467dfd236..131fb738e7 100644 --- a/src/widgets/lv_bar.c +++ b/src/widgets/lv_bar.c @@ -384,28 +384,38 @@ static void draw_indic(lv_event_t * e) lv_coord_t short_side = LV_MIN(barw, barh); if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; - lv_draw_rect_dsc_t draw_indic_dsc; - lv_draw_rect_dsc_init(&draw_indic_dsc); - lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_indic_dsc); - lv_area_t indic_area; lv_area_copy(&indic_area, &bar->indic_area); + lv_draw_rect_dsc_t draw_rect_dsc; + lv_draw_rect_dsc_init(&draw_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_rect_dsc); + + lv_obj_draw_dsc_t obj_draw_dsc; + lv_obj_draw_dsc_init(&obj_draw_dsc, clip_area); + obj_draw_dsc.part = LV_PART_INDICATOR; + obj_draw_dsc.rect_dsc = &draw_rect_dsc; + obj_draw_dsc.draw_area = bar->indic_area; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &obj_draw_dsc); + /*Draw only the shadow if the indicator is long enough. *The radius of the bg and the indicator can make a strange shape where *it'd be very difficult to draw shadow.*/ if((hor && lv_area_get_width(&bar->indic_area) > bg_radius * 2) || (!hor && lv_area_get_height(&bar->indic_area) > bg_radius * 2)) { - lv_opa_t bg_opa = draw_indic_dsc.bg_opa; - lv_opa_t bg_img_opa = draw_indic_dsc.bg_img_opa; - lv_opa_t border_opa = draw_indic_dsc.border_opa; - draw_indic_dsc.bg_opa = LV_OPA_TRANSP; - draw_indic_dsc.bg_img_opa = LV_OPA_TRANSP; - draw_indic_dsc.border_opa = LV_OPA_TRANSP; - lv_draw_rect(&bar->indic_area, clip_area, &draw_indic_dsc); - draw_indic_dsc.bg_opa = bg_opa; - draw_indic_dsc.bg_img_opa = bg_img_opa; - draw_indic_dsc.border_opa = border_opa; + lv_opa_t bg_opa = draw_rect_dsc.bg_opa; + lv_opa_t bg_img_opa = draw_rect_dsc.bg_img_opa; + lv_opa_t border_opa = draw_rect_dsc.border_opa; + draw_rect_dsc.bg_opa = LV_OPA_TRANSP; + draw_rect_dsc.bg_img_opa = LV_OPA_TRANSP; + draw_rect_dsc.border_opa = LV_OPA_TRANSP; + + lv_draw_rect(&bar->indic_area, clip_area, &draw_rect_dsc); + + draw_rect_dsc.bg_opa = bg_opa; + draw_rect_dsc.bg_img_opa = bg_img_opa; + draw_rect_dsc.border_opa = border_opa; } #if LV_DRAW_COMPLEX @@ -421,10 +431,10 @@ static void draw_indic(lv_event_t * e) #endif /*Draw_only the background and background image*/ - lv_opa_t shadow_opa = draw_indic_dsc.shadow_opa; - lv_opa_t border_opa = draw_indic_dsc.border_opa; - draw_indic_dsc.border_opa = LV_OPA_TRANSP; - draw_indic_dsc.shadow_opa = LV_OPA_TRANSP; + lv_opa_t shadow_opa = draw_rect_dsc.shadow_opa; + lv_opa_t border_opa = draw_rect_dsc.border_opa; + draw_rect_dsc.border_opa = LV_OPA_TRANSP; + draw_rect_dsc.shadow_opa = LV_OPA_TRANSP; /*Get the max possible indicator area. The gradient should be applied on this*/ lv_area_t mask_indic_max_area; @@ -445,24 +455,26 @@ static void draw_indic(lv_event_t * e) #if LV_DRAW_COMPLEX /*Create a mask to the current indicator area to see only this part from the whole gradient.*/ lv_draw_mask_radius_param_t mask_indic_param; - lv_draw_mask_radius_init(&mask_indic_param, &bar->indic_area, draw_indic_dsc.radius, false); + lv_draw_mask_radius_init(&mask_indic_param, &bar->indic_area, draw_rect_dsc.radius, false); int16_t mask_indic_id = lv_draw_mask_add(&mask_indic_param, NULL); #endif - lv_draw_rect(&mask_indic_max_area, clip_area, &draw_indic_dsc); - draw_indic_dsc.border_opa = border_opa; - draw_indic_dsc.shadow_opa = shadow_opa; + lv_draw_rect(&mask_indic_max_area, clip_area, &draw_rect_dsc); + draw_rect_dsc.border_opa = border_opa; + draw_rect_dsc.shadow_opa = shadow_opa; /*Draw the border*/ - draw_indic_dsc.bg_opa = LV_OPA_TRANSP; - draw_indic_dsc.bg_img_opa = LV_OPA_TRANSP; - draw_indic_dsc.shadow_opa = LV_OPA_TRANSP; - lv_draw_rect(&bar->indic_area, clip_area, &draw_indic_dsc); + draw_rect_dsc.bg_opa = LV_OPA_TRANSP; + draw_rect_dsc.bg_img_opa = LV_OPA_TRANSP; + draw_rect_dsc.shadow_opa = LV_OPA_TRANSP; + lv_draw_rect(&bar->indic_area, clip_area, &draw_rect_dsc); #if LV_DRAW_COMPLEX lv_draw_mask_remove_id(mask_indic_id); lv_draw_mask_remove_id(mask_bg_id); #endif + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &obj_draw_dsc); } static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e)