Skip to content

Commit 1eb2d3a

Browse files
refactor(draw): extract function to improve readability (#7229)
Signed-off-by: Cristian Stoica <[email protected]>
1 parent c94216a commit 1eb2d3a

File tree

2 files changed

+57
-46
lines changed

2 files changed

+57
-46
lines changed

src/display/lv_display.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ typedef enum {
5454

5555
/**
5656
* Always redraw the whole screen even if only one pixel has been changed.
57-
* With 2 buffers in flush_cb only and address change is required.
57+
* With 2 buffers in flush_cb only an address change is required.
5858
*/
5959
LV_DISPLAY_RENDER_MODE_FULL,
6060
} lv_display_render_mode_t;

src/draw/lv_draw.c

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,12 @@
3232
* STATIC PROTOTYPES
3333
**********************/
3434
static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check);
35+
static void lv_cleanup_task(lv_draw_task_t * t, lv_display_t * disp);
3536

3637
static inline uint32_t get_layer_size_kb(uint32_t size_byte)
3738
{
3839
return size_byte < 1024 ? 1 : size_byte >> 10;
3940
}
40-
/**********************
41-
* STATIC VARIABLES
42-
**********************/
4341

4442
/**********************
4543
* STATIC VARIABLES
@@ -204,50 +202,15 @@ bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer)
204202
/*Remove the finished tasks first*/
205203
lv_draw_task_t * t_prev = NULL;
206204
lv_draw_task_t * t = layer->draw_task_head;
205+
lv_draw_task_t * t_next;
207206
while(t) {
208-
lv_draw_task_t * t_next = t->next;
207+
t_next = t->next;
209208
if(t->state == LV_DRAW_TASK_STATE_READY) {
210-
if(t_prev) t_prev->next = t->next; /*Remove it by assigning the next task to the previous*/
211-
else layer->draw_task_head = t_next; /*If it was the head, set the next as head*/
212-
213-
/*If it was layer drawing free the layer too*/
214-
if(t->type == LV_DRAW_TASK_TYPE_LAYER) {
215-
lv_draw_image_dsc_t * draw_image_dsc = t->draw_dsc;
216-
lv_layer_t * layer_drawn = (lv_layer_t *)draw_image_dsc->src;
217-
218-
if(layer_drawn->draw_buf) {
219-
int32_t h = lv_area_get_height(&layer_drawn->buf_area);
220-
uint32_t layer_size_byte = h * layer_drawn->draw_buf->header.stride;
221-
222-
_draw_info.used_memory_for_layers_kb -= get_layer_size_kb(layer_size_byte);
223-
LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb);
224-
lv_draw_buf_destroy(layer_drawn->draw_buf);
225-
layer_drawn->draw_buf = NULL;
226-
}
227-
228-
/*Remove the layer from the display's*/
229-
if(disp) {
230-
lv_layer_t * l2 = disp->layer_head;
231-
while(l2) {
232-
if(l2->next == layer_drawn) {
233-
l2->next = layer_drawn->next;
234-
break;
235-
}
236-
l2 = l2->next;
237-
}
238-
239-
if(disp->layer_deinit) disp->layer_deinit(disp, layer_drawn);
240-
lv_free(layer_drawn);
241-
}
242-
}
243-
lv_draw_label_dsc_t * draw_label_dsc = lv_draw_task_get_label_dsc(t);
244-
if(draw_label_dsc && draw_label_dsc->text_local) {
245-
lv_free((void *)draw_label_dsc->text);
246-
draw_label_dsc->text = NULL;
247-
}
248-
249-
lv_free(t->draw_dsc);
250-
lv_free(t);
209+
lv_cleanup_task(t, disp);
210+
if(t_prev != NULL)
211+
t_prev->next = t_next;
212+
else
213+
layer->draw_task_head = t_next;
251214
}
252215
else {
253216
t_prev = t;
@@ -523,3 +486,51 @@ static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check)
523486

524487
return true;
525488
}
489+
490+
/**
491+
* Clean-up resources allocated by a finished task
492+
* @param t pointer to a draw task
493+
* @param disp pointer to a display on which the task was drawn
494+
*/
495+
static void lv_cleanup_task(lv_draw_task_t * t, lv_display_t * disp)
496+
{
497+
/*If it was layer drawing free the layer too*/
498+
if(t->type == LV_DRAW_TASK_TYPE_LAYER) {
499+
lv_draw_image_dsc_t * draw_image_dsc = t->draw_dsc;
500+
lv_layer_t * layer_drawn = (lv_layer_t *)draw_image_dsc->src;
501+
502+
if(layer_drawn->draw_buf) {
503+
int32_t h = lv_area_get_height(&layer_drawn->buf_area);
504+
uint32_t layer_size_byte = h * layer_drawn->draw_buf->header.stride;
505+
506+
_draw_info.used_memory_for_layers_kb -= get_layer_size_kb(layer_size_byte);
507+
LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb);
508+
lv_draw_buf_destroy(layer_drawn->draw_buf);
509+
layer_drawn->draw_buf = NULL;
510+
}
511+
512+
/*Remove the layer from the display's*/
513+
if(disp) {
514+
lv_layer_t * l2 = disp->layer_head;
515+
while(l2) {
516+
if(l2->next == layer_drawn) {
517+
l2->next = layer_drawn->next;
518+
break;
519+
}
520+
l2 = l2->next;
521+
}
522+
523+
if(disp->layer_deinit) disp->layer_deinit(disp, layer_drawn);
524+
lv_free(layer_drawn);
525+
}
526+
}
527+
lv_draw_label_dsc_t * draw_label_dsc = lv_draw_task_get_label_dsc(t);
528+
if(draw_label_dsc && draw_label_dsc->text_local) {
529+
lv_free((void *)draw_label_dsc->text);
530+
draw_label_dsc->text = NULL;
531+
}
532+
533+
lv_free(t->draw_dsc);
534+
lv_free(t);
535+
536+
}

0 commit comments

Comments
 (0)