diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index b653b2024..850cfeb97 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -247,9 +247,6 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->h_set = lv_area_get_height(&new_obj->coords); } - - new_obj->ext_draw_pad = 0; - /*Set attributes*/ new_obj->flags = LV_OBJ_FLAG_CLICKABLE; new_obj->flags |= LV_OBJ_FLAG_SNAPABLE; @@ -275,7 +272,6 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*Copy the attributes if required*/ if(copy != NULL) { lv_area_copy(&new_obj->coords, ©->coords); - new_obj->ext_draw_pad = copy->ext_draw_pad; new_obj->flags = copy->flags; if(copy->spec_attr) { @@ -411,7 +407,7 @@ void lv_obj_invalidate(const lv_obj_t * obj) /*Truncate the area to the object*/ lv_area_t obj_coords; - lv_coord_t ext_size = obj->ext_draw_pad; + lv_coord_t ext_size = _lv_obj_get_ext_draw_pad(obj); lv_area_copy(&obj_coords, &obj->coords); obj_coords.x1 -= ext_size; obj_coords.y1 -= ext_size; @@ -442,7 +438,7 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) /*Truncate the area to the object*/ lv_area_t obj_coords; - lv_coord_t ext_size = obj->ext_draw_pad; + lv_coord_t ext_size = _lv_obj_get_ext_draw_pad(obj); lv_area_copy(&obj_coords, &obj->coords); obj_coords.x1 -= ext_size; obj_coords.y1 -= ext_size; @@ -478,7 +474,7 @@ bool lv_obj_is_visible(const lv_obj_t * obj) LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_area_t obj_coords; - lv_coord_t ext_size = obj->ext_draw_pad; + lv_coord_t ext_size = _lv_obj_get_ext_draw_pad(obj); lv_area_copy(&obj_coords, &obj->coords); obj_coords.x1 -= ext_size; obj_coords.y1 -= ext_size; @@ -644,6 +640,16 @@ void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t left, lv_coord_t right #endif } +/** + * Get the extended draw area of an object. + * @param obj pointer to an object + * @return the size extended draw area around the real coordinates + */ +lv_coord_t _lv_obj_get_ext_draw_pad(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->ext_draw_pad; + else return 0; +} /*--------------------- * Appearance set *--------------------*/ @@ -2003,8 +2009,9 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param) } } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + lv_coord_t * s = param; lv_coord_t d = _lv_obj_get_draw_rect_ext_pad_size(obj, LV_OBJ_PART_MAIN); - obj->ext_draw_pad = LV_MATH_MAX(obj->ext_draw_pad, d); + *s = LV_MATH_MAX(*s, d); } else if(sign == LV_SIGNAL_STYLE_CHG) { if(_lv_obj_is_grid_item(obj)) lv_grid_item_refr_pos(obj); diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 5648044a8..ae0e18e54 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -211,6 +211,7 @@ typedef struct { lv_flex_cont_t flex_cont; lv_point_t scroll; /**< The current X/Y scroll offset*/ + lv_coord_t ext_draw_pad; /**< EXTend the size in every direction for drawing. */ #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY uint8_t ext_click_pad; /**< Extra click padding in all direction */ @@ -230,7 +231,6 @@ struct _lv_obj_t { lv_obj_spec_attr_t * spec_attr; struct _lv_obj_t * parent; /**< Pointer to the parent object*/ - lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/ lv_signal_cb_t signal_cb; /**< Object type specific signal function*/ lv_design_cb_t design_cb; /**< Object type specific design function*/ @@ -240,15 +240,13 @@ struct _lv_obj_t { /*Attributes and states*/ lv_obj_flag_t flags; - lv_state_t state; + lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/ lv_coord_t x_set; lv_coord_t y_set; lv_coord_t w_set; lv_coord_t h_set; - - lv_coord_t ext_draw_pad; /**< EXTend the size in every direction for drawing. */ }; enum { @@ -409,6 +407,13 @@ void lv_obj_move_background(lv_obj_t * obj); */ void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t left, lv_coord_t right, lv_coord_t top, lv_coord_t bottom); +/** + * Get the extended draw area of an object. + * @param obj pointer to an object + * @return the size extended draw area around the real coordinates + */ +lv_coord_t _lv_obj_get_ext_draw_pad(const lv_obj_t * obj); + /*--------------------- * Appearance set *--------------------*/ diff --git a/src/lv_core/lv_obj_draw.c b/src/lv_core/lv_obj_draw.c index 86cbf84b5..643ddb983 100644 --- a/src/lv_core/lv_obj_draw.c +++ b/src/lv_core/lv_obj_draw.c @@ -385,9 +385,19 @@ void _lv_obj_refresh_ext_draw_pad(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - obj->ext_draw_pad = 0; - obj->signal_cb(obj, LV_SIGNAL_REFR_EXT_DRAW_PAD, NULL); + lv_coord_t s = 0; + obj->signal_cb(obj, LV_SIGNAL_REFR_EXT_DRAW_PAD, &s); + /*Store the result if the special attrs already allocated*/ + if(obj->spec_attr) { + obj->spec_attr = s; + } + /* Allocate spec. attrs. only if the result is not zero. + * Zero is the default value if the spec. attr. are not defined. */ + else if(s != 0) { + lv_obj_allocate_rare_attr(obj); + obj->spec_attr->ext_draw_pad = s; + } } /** diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index ce8119808..cb554fcf9 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -664,7 +664,7 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p) lv_area_t obj_mask; lv_area_t obj_ext_mask; lv_area_t obj_area; - lv_coord_t ext_size = obj->ext_draw_pad; + lv_coord_t ext_size = _lv_obj_get_ext_draw_pad(obj); lv_obj_get_coords(obj, &obj_area); obj_area.x1 -= ext_size; obj_area.y1 -= ext_size; @@ -705,7 +705,7 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p) lv_ll_t * ll = _lv_obj_get_child_ll(obj); _LV_LL_READ_BACK(ll, child_p) { lv_obj_get_coords(child_p, &child_area); - ext_size = child_p->ext_draw_pad; + ext_size = _lv_obj_get_ext_draw_pad(child_p); child_area.x1 -= ext_size; child_area.y1 -= ext_size; child_area.x2 += ext_size; diff --git a/src/lv_widgets/lv_bar.c b/src/lv_widgets/lv_bar.c index 6b3daba42..81615b8bd 100644 --- a/src/lv_widgets/lv_bar.c +++ b/src/lv_widgets/lv_bar.c @@ -631,7 +631,8 @@ static lv_res_t lv_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param) indic_size = _lv_obj_get_draw_rect_ext_pad_size(bar, LV_BAR_PART_INDIC); /*Bg size is handled by lv_obj*/ - bar->ext_draw_pad = LV_MATH_MAX(bar->ext_draw_pad, indic_size); + lv_coord_t * s = param; + *s = LV_MATH_MAX(*s, indic_size); } if(sign == LV_SIGNAL_CLEANUP) { diff --git a/src/lv_widgets/lv_img.c b/src/lv_widgets/lv_img.c index ee1fbc0f7..94c4967b3 100644 --- a/src/lv_widgets/lv_img.c +++ b/src/lv_widgets/lv_img.c @@ -754,6 +754,7 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + lv_coord_t * s = param; lv_style_int_t transf_zoom = lv_obj_get_style_transform_zoom(img, LV_IMG_PART_MAIN); transf_zoom = (transf_zoom * ext->zoom) >> 8; @@ -766,11 +767,11 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) lv_coord_t w = lv_obj_get_width(img); lv_coord_t h = lv_obj_get_height(img); _lv_img_buf_get_transformed_area(&a, w, h, transf_angle, transf_zoom, &ext->pivot); - lv_coord_t pad_ori = img->ext_draw_pad; - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, pad_ori - a.x1); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, pad_ori - a.y1); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, pad_ori + a.x2 - w); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, pad_ori + a.y2 - h); + lv_coord_t pad_ori = *s; + *s = LV_MATH_MAX(*s, pad_ori - a.x1); + *s = LV_MATH_MAX(*s, pad_ori - a.y1); + *s = LV_MATH_MAX(*s, pad_ori + a.x2 - w); + *s = LV_MATH_MAX(*s, pad_ori + a.y2 - h); } /*Handle the padding of the background*/ @@ -779,10 +780,10 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) lv_style_int_t top = lv_obj_get_style_pad_top(img, LV_IMG_PART_MAIN); lv_style_int_t bottom = lv_obj_get_style_pad_bottom(img, LV_IMG_PART_MAIN); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, left); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, right); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, top); - img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, bottom); + *s = LV_MATH_MAX(*s, left); + *s = LV_MATH_MAX(*s, right); + *s = LV_MATH_MAX(*s, top); + *s = LV_MATH_MAX(*s, bottom); } else if(sign == LV_SIGNAL_HIT_TEST) { lv_hit_test_info_t * info = param; diff --git a/src/lv_widgets/lv_imgbtn.c b/src/lv_widgets/lv_imgbtn.c index 3dca1c9e2..e3f453c8e 100644 --- a/src/lv_widgets/lv_imgbtn.c +++ b/src/lv_widgets/lv_imgbtn.c @@ -465,10 +465,11 @@ static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * par lv_style_int_t top = lv_obj_get_style_pad_top(imgbtn, LV_IMGBTN_PART_MAIN); lv_style_int_t bottom = lv_obj_get_style_pad_bottom(imgbtn, LV_IMGBTN_PART_MAIN); - imgbtn->ext_draw_pad = LV_MATH_MAX(imgbtn->ext_draw_pad, left); - imgbtn->ext_draw_pad = LV_MATH_MAX(imgbtn->ext_draw_pad, right); - imgbtn->ext_draw_pad = LV_MATH_MAX(imgbtn->ext_draw_pad, top); - imgbtn->ext_draw_pad = LV_MATH_MAX(imgbtn->ext_draw_pad, bottom); + lv_coord_t * s = param; + *s = LV_MATH_MAX(*s, left); + *s = LV_MATH_MAX(*s, right); + *s = LV_MATH_MAX(*s, top); + *s = LV_MATH_MAX(*s, bottom); } else if(sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { refr_img(imgbtn); diff --git a/src/lv_widgets/lv_line.c b/src/lv_widgets/lv_line.c index 642edfc6d..a40eb5b3b 100644 --- a/src/lv_widgets/lv_line.c +++ b/src/lv_widgets/lv_line.c @@ -237,7 +237,8 @@ static lv_res_t lv_line_signal(lv_obj_t * line, lv_signal_t sign, void * param) else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { /*The corner of the skew lines is out of the intended area*/ lv_style_int_t line_width = lv_obj_get_style_line_width(line, LV_LINE_PART_MAIN); - if(line->ext_draw_pad < line_width) line->ext_draw_pad = line_width; + lv_coord_t * s = param; + if(*s < line_width) *s = line_width; } else if(sign == LV_SIGNAL_GET_SELF_SIZE) { lv_line_ext_t * ext = lv_obj_get_ext_attr(line); diff --git a/src/lv_widgets/lv_roller.c b/src/lv_widgets/lv_roller.c index 31109fd71..d3ac5a908 100644 --- a/src/lv_widgets/lv_roller.c +++ b/src/lv_widgets/lv_roller.c @@ -703,10 +703,11 @@ static lv_res_t lv_roller_label_signal(lv_obj_t * label, lv_signal_t sign, void if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { /*If the selected text has a larger font it needs some extra space to draw it*/ + lv_coord_t * s = param; lv_obj_t * roller = lv_obj_get_parent(label); lv_coord_t sel_w = get_selected_label_width(roller); lv_coord_t label_w = lv_obj_get_width(label); - label->ext_draw_pad = LV_MATH_MAX(label->ext_draw_pad, sel_w - label_w); + *s = LV_MATH_MAX(*s, sel_w - label_w); } return res; diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index 5f1d98154..2dfff6bb5 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -404,7 +404,8 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par knob_size += _lv_obj_get_draw_rect_ext_pad_size(slider, LV_SLIDER_PART_KNOB); /*Indic. size is handled by bar*/ - slider->ext_draw_pad = LV_MATH_MAX(slider->ext_draw_pad, knob_size); + lv_coord_t * s = param; + *s = LV_MATH_MAX(*s, knob_size); } else if(sign == LV_SIGNAL_CONTROL) { diff --git a/src/lv_widgets/lv_switch.c b/src/lv_widgets/lv_switch.c index effcdfd5a..36fcb8772 100644 --- a/src/lv_widgets/lv_switch.c +++ b/src/lv_widgets/lv_switch.c @@ -314,7 +314,8 @@ static lv_res_t lv_switch_signal(lv_obj_t * sw, lv_signal_t sign, void * param) knob_size += _lv_obj_get_draw_rect_ext_pad_size(sw, LV_SWITCH_PART_KNOB); /*Indic. size is handled by bar*/ - sw->ext_draw_pad = LV_MATH_MAX(sw->ext_draw_pad, knob_size); + lv_coord_t * s = param; + *s = LV_MATH_MAX(*s, knob_size); } else if(sign == LV_SIGNAL_GET_EDITABLE) { #if LV_USE_GROUP