fix(invalidation): do not invalidate an area if it's not on a visible screen
This commit is contained in:
@@ -490,36 +490,38 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
|
|||||||
/*Invalidate the object only if it belongs to the current or previous'*/
|
/*Invalidate the object only if it belongs to the current or previous'*/
|
||||||
lv_obj_t * obj_scr = lv_obj_get_screen(obj);
|
lv_obj_t * obj_scr = lv_obj_get_screen(obj);
|
||||||
lv_disp_t * disp = lv_obj_get_disp(obj_scr);
|
lv_disp_t * disp = lv_obj_get_disp(obj_scr);
|
||||||
if(obj_scr == lv_disp_get_scr_act(disp) ||
|
if(obj_scr != lv_disp_get_scr_act(disp) &&
|
||||||
obj_scr == lv_disp_get_scr_prev(disp) ||
|
obj_scr != lv_disp_get_scr_prev(disp) &&
|
||||||
obj_scr == lv_disp_get_layer_top(disp) ||
|
obj_scr != lv_disp_get_layer_top(disp) &&
|
||||||
obj_scr == lv_disp_get_layer_sys(disp)) {
|
obj_scr != lv_disp_get_layer_sys(disp))
|
||||||
|
{
|
||||||
/*Truncate the area to the object*/
|
return false;
|
||||||
lv_area_t obj_coords;
|
|
||||||
lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj);
|
|
||||||
lv_area_copy(&obj_coords, &obj->coords);
|
|
||||||
obj_coords.x1 -= ext_size;
|
|
||||||
obj_coords.y1 -= ext_size;
|
|
||||||
obj_coords.x2 += ext_size;
|
|
||||||
obj_coords.y2 += ext_size;
|
|
||||||
|
|
||||||
bool is_common;
|
|
||||||
|
|
||||||
is_common = _lv_area_intersect(area, area, &obj_coords);
|
|
||||||
if(is_common == false) return false; /*The area is not on the object*/
|
|
||||||
|
|
||||||
/*Truncate recursively to the parents*/
|
|
||||||
lv_obj_t * par = lv_obj_get_parent(obj);
|
|
||||||
while(par != NULL) {
|
|
||||||
is_common = _lv_area_intersect(area, area, &par->coords);
|
|
||||||
if(is_common == false) return false; /*If no common parts with parent break;*/
|
|
||||||
if(lv_obj_has_flag(par, LV_OBJ_FLAG_HIDDEN)) return false; /*If the parent is hidden then the child is hidden and won't be drawn*/
|
|
||||||
|
|
||||||
par = lv_obj_get_parent(par);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*Truncate the area to the object*/
|
||||||
|
lv_area_t obj_coords;
|
||||||
|
lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj);
|
||||||
|
lv_area_copy(&obj_coords, &obj->coords);
|
||||||
|
obj_coords.x1 -= ext_size;
|
||||||
|
obj_coords.y1 -= ext_size;
|
||||||
|
obj_coords.x2 += ext_size;
|
||||||
|
obj_coords.y2 += ext_size;
|
||||||
|
|
||||||
|
bool is_common;
|
||||||
|
|
||||||
|
is_common = _lv_area_intersect(area, area, &obj_coords);
|
||||||
|
if(is_common == false) return false; /*The area is not on the object*/
|
||||||
|
|
||||||
|
/*Truncate recursively to the parents*/
|
||||||
|
lv_obj_t * par = lv_obj_get_parent(obj);
|
||||||
|
while(par != NULL) {
|
||||||
|
is_common = _lv_area_intersect(area, area, &par->coords);
|
||||||
|
if(is_common == false) return false; /*If no common parts with parent break;*/
|
||||||
|
if(lv_obj_has_flag(par, LV_OBJ_FLAG_HIDDEN)) return false; /*If the parent is hidden then the child is hidden and won't be drawn*/
|
||||||
|
|
||||||
|
par = lv_obj_get_parent(par);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user