|
32 | 32 | * STATIC PROTOTYPES |
33 | 33 | **********************/ |
34 | 34 | 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); |
35 | 36 |
|
36 | 37 | static inline uint32_t get_layer_size_kb(uint32_t size_byte) |
37 | 38 | { |
38 | 39 | return size_byte < 1024 ? 1 : size_byte >> 10; |
39 | 40 | } |
40 | | -/********************** |
41 | | - * STATIC VARIABLES |
42 | | - **********************/ |
43 | 41 |
|
44 | 42 | /********************** |
45 | 43 | * STATIC VARIABLES |
@@ -204,50 +202,15 @@ bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer) |
204 | 202 | /*Remove the finished tasks first*/ |
205 | 203 | lv_draw_task_t * t_prev = NULL; |
206 | 204 | lv_draw_task_t * t = layer->draw_task_head; |
| 205 | + lv_draw_task_t * t_next; |
207 | 206 | while(t) { |
208 | | - lv_draw_task_t * t_next = t->next; |
| 207 | + t_next = t->next; |
209 | 208 | 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; |
251 | 214 | } |
252 | 215 | else { |
253 | 216 | t_prev = t; |
@@ -523,3 +486,51 @@ static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check) |
523 | 486 |
|
524 | 487 | return true; |
525 | 488 | } |
| 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