fix(snapshot): need to set disp refreshing firstly (#4816)

Signed-off-by: Xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
Neo Xu
2023-11-18 15:09:45 +08:00
committed by GitHub
parent b10294186a
commit defaafaa44
3 changed files with 24 additions and 0 deletions
+9
View File
@@ -318,6 +318,15 @@ lv_display_t * _lv_refr_get_disp_refreshing(void)
return disp_refr; return disp_refr;
} }
/**
* Get the display which is being refreshed
* @return the display being refreshed
*/
void _lv_refr_set_disp_refreshing(lv_display_t * disp)
{
disp_refr = disp;
}
/** /**
* Called periodically to handle the refreshing * Called periodically to handle the refreshing
* @param tmr pointer to the timer itself * @param tmr pointer to the timer itself
+6
View File
@@ -81,6 +81,12 @@ void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p);
*/ */
lv_display_t * _lv_refr_get_disp_refreshing(void); lv_display_t * _lv_refr_get_disp_refreshing(void);
/**
* Set the display which is being refreshed
* @param disp the display being refreshed
*/
void _lv_refr_set_disp_refreshing(lv_display_t * disp);
/** /**
* Called periodically to handle the refreshing * Called periodically to handle the refreshing
* @param timer pointer to the timer itself * @param timer pointer to the timer itself
+9
View File
@@ -132,6 +132,12 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima
layer.color_format = cf; layer.color_format = cf;
layer.clip_area = snapshot_area; layer.clip_area = snapshot_area;
lv_display_t * disp_old = _lv_refr_get_disp_refreshing();
lv_display_t * disp_new = lv_obj_get_disp(obj);
lv_layer_t * layer_old = disp_new->layer_head;
disp_new->layer_head = &layer;
_lv_refr_set_disp_refreshing(disp_new);
lv_obj_redraw(&layer, obj); lv_obj_redraw(&layer, obj);
while(layer.draw_task_head) { while(layer.draw_task_head) {
@@ -139,6 +145,9 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima
lv_draw_dispatch_layer(NULL, &layer); lv_draw_dispatch_layer(NULL, &layer);
} }
disp_new->layer_head = layer_old;
_lv_refr_set_disp_refreshing(disp_old);
return LV_RESULT_OK; return LV_RESULT_OK;
} }