mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-28 07:03:00 +08:00
perf(obj): move ext_draw_pad to spec_attrs
It saves some memory becasue it's rarly used any by default evaluated as zero.
This commit is contained in:
parent
d06aa859c9
commit
65fc61c9c0
@ -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);
|
||||
|
@ -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
|
||||
*--------------------*/
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user