From b4dae16e22db91d062e9c84177a10f2c581144f7 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 19 Nov 2019 06:25:14 +0100 Subject: [PATCH] move lv_draw_buf to lv_mem as lv_mem_buf This way they can be used as general purpose buffers not only for drawing --- src/lv_core/lv_obj.c | 4 +- src/lv_core/lv_refr.c | 2 +- src/lv_draw/lv_draw.c | 116 --------------------------------- src/lv_draw/lv_draw.h | 44 +++---------- src/lv_draw/lv_draw_img.c | 14 ++-- src/lv_draw/lv_draw_label.c | 16 ++--- src/lv_draw/lv_draw_rect.c | 36 +++++----- src/lv_draw/lv_draw_triangle.c | 4 +- src/lv_font/lv_font_fmt_txt.c | 8 +-- src/lv_misc/lv_gc.h | 2 +- src/lv_misc/lv_mem.c | 68 +++++++++++++++++++ src/lv_misc/lv_mem.h | 27 ++++++++ src/lv_objx/lv_canvas.c | 8 +-- src/lv_objx/lv_label.c | 4 +- src/lv_objx/lv_objmask.c | 12 ++-- src/lv_objx/lv_page.c | 4 +- 16 files changed, 161 insertions(+), 208 deletions(-) delete mode 100644 src/lv_draw/lv_draw.c diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index a0020abea..638615ebe 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -2441,7 +2441,7 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area lv_draw_rect(&obj->coords, clip_area, style, lv_obj_get_opa_scale(obj)); if(style->body.corner_mask) { - lv_draw_mask_radius_param_t * mp = lv_draw_buf_get(sizeof(lv_draw_mask_radius_param_t)); + lv_draw_mask_radius_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t)); lv_draw_mask_radius_init(mp, &obj->coords, style->body.radius, false); /*Add the mask and use `obj+8` as custom id. Don't use `obj` directly because it might be used by the user*/ @@ -2452,7 +2452,7 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area const lv_style_t * style = lv_obj_get_style(obj); if(style->body.corner_mask) { lv_draw_mask_radius_param_t * param = lv_draw_mask_remove_custom(obj + 8); - lv_draw_buf_release(param); + lv_mem_buf_release(param); } } diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index de9db39f2..d8d4ce6c0 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -217,7 +217,7 @@ void lv_disp_refr_task(lv_task_t * task) } } - lv_draw_buf_free_all(); + lv_mem_buf_free_all(); LV_LOG_TRACE("lv_refr_task: ready"); } diff --git a/src/lv_draw/lv_draw.c b/src/lv_draw/lv_draw.c deleted file mode 100644 index b7fb00170..000000000 --- a/src/lv_draw/lv_draw.c +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @file lv_draw.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include -#include -#include "lv_draw.h" -#include "../lv_core/lv_debug.h" -#include "../lv_misc/lv_math.h" -#include "../lv_misc/lv_log.h" -#include "../lv_misc/lv_math.h" -#include "../lv_misc/lv_mem.h" -#include "../lv_misc/lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Give a buffer with the given to use during drawing. - * Be careful to not use the buffer while other processes are using it. - * @param size the required size - */ -void * lv_draw_buf_get(uint32_t size) -{ - /*Try to find a free buffer with suitable size */ - uint8_t i; - for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { - if(_lv_draw_buf[i].used == 0 && _lv_draw_buf[i].size >= size) { - _lv_draw_buf[i].used = 1; - return _lv_draw_buf[i].p; - } - } - - /*Reallocate a free buffer*/ - for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { - if(_lv_draw_buf[i].used == 0) { - _lv_draw_buf[i].used = 1; - _lv_draw_buf[i].size = size; - /*if this fails you probably need to increase your LV_MEM_SIZE/heap size*/ - _lv_draw_buf[i].p = lv_mem_realloc(_lv_draw_buf[i].p, size); - LV_ASSERT_MEM(_lv_draw_buf[i].p); - return _lv_draw_buf[i].p; - } - } - - LV_LOG_ERROR("lv_draw_buf_get: no free buffer. Increase LV_DRAW_BUF_MAX_NUM."); - - return NULL; -} - -/** - * Release the draw buffer - * @param p buffer to release - */ -void lv_draw_buf_release(void * p) -{ - uint8_t i; - for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { - if(_lv_draw_buf[i].p == p) { - _lv_draw_buf[i].used = 0; - return; - } - } - - LV_LOG_ERROR("lv_draw_buf_release: p is not a known buffer") -} - -/** - * Free all draw buffers - */ -void lv_draw_buf_free_all(void) -{ - uint8_t i; - for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { - if(_lv_draw_buf[i].p) { - lv_mem_free(_lv_draw_buf[i].p); - _lv_draw_buf[i].p = NULL; - _lv_draw_buf[i].used = 0; - _lv_draw_buf[i].size = 0; - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/lv_draw/lv_draw.h b/src/lv_draw/lv_draw.h index f46fe3ed1..8beabd53b 100644 --- a/src/lv_draw/lv_draw.h +++ b/src/lv_draw/lv_draw.h @@ -23,45 +23,27 @@ extern "C" { #include "../lv_misc/lv_txt.h" #include "lv_img_decoder.h" +#include "lv_draw_rect.h" +#include "lv_draw_label.h" +#include "lv_draw_img.h" +#include "lv_draw_line.h" +#include "lv_draw_triangle.h" +#include "lv_draw_arc.h" +#include "lv_draw_blend.h" +#include "lv_draw_mask.h" + /********************* * DEFINES *********************/ -#ifndef LV_DRAW_BUF_MAX_NUM -#define LV_DRAW_BUF_MAX_NUM 16 -#endif /********************** * TYPEDEFS **********************/ -typedef struct { - void * p; - uint16_t size; - uint8_t used :1; -}lv_draw_buf_t; /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Give a buffer with the given to use during drawing. - * Be careful to not use the buffer while other processes are using it. - * @param size the required size - */ -void * lv_draw_buf_get(uint32_t size); - -/** - * Release the draw buffer - * @param p buffer to release - */ -void lv_draw_buf_release(void * p); - -/** - * Free all draw buffers - */ -void lv_draw_buf_free_all(void); - - /********************** * GLOBAL VARIABLES **********************/ @@ -73,14 +55,6 @@ void lv_draw_buf_free_all(void); /********************** * POST INCLUDES *********************/ -#include "lv_draw_rect.h" -#include "lv_draw_label.h" -#include "lv_draw_img.h" -#include "lv_draw_line.h" -#include "lv_draw_triangle.h" -#include "lv_draw_arc.h" -#include "lv_draw_blend.h" -#include "lv_draw_mask.h" #ifdef __cplusplus } /* extern "C" */ diff --git a/src/lv_draw/lv_draw_img.c b/src/lv_draw/lv_draw_img.c index d23de6e88..701822edd 100644 --- a/src/lv_draw/lv_draw_img.c +++ b/src/lv_draw/lv_draw_img.c @@ -275,7 +275,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas lv_coord_t width = lv_area_get_width(&mask_com); - uint8_t * buf = lv_draw_buf_get(lv_area_get_width(&mask_com) * LV_IMG_PX_SIZE_ALPHA_BYTE); /*+1 because of the possible alpha byte*/ + uint8_t * buf = lv_mem_buf_get(lv_area_get_width(&mask_com) * LV_IMG_PX_SIZE_ALPHA_BYTE); /*+1 because of the possible alpha byte*/ lv_area_t line; lv_area_copy(&line, &mask_com); @@ -293,7 +293,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas if(read_res != LV_RES_OK) { lv_img_decoder_close(&cdsc->dec_dsc); LV_LOG_WARN("Image draw can't read the line"); - lv_draw_buf_release(buf); + lv_mem_buf_release(buf); return LV_RES_INV; } @@ -303,7 +303,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas line.y2++; y++; } - lv_draw_buf_release(buf); + lv_mem_buf_release(buf); } return LV_RES_OK; @@ -359,8 +359,8 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, /*Build the image and a mask line-by-line*/ uint32_t mask_buf_size = lv_area_get_size(&draw_area) > LV_HOR_RES_MAX ? LV_HOR_RES_MAX : lv_area_get_size(&draw_area); - lv_color_t * map2 = lv_draw_buf_get(mask_buf_size * sizeof(lv_color_t)); - lv_opa_t * mask_buf = lv_draw_buf_get(mask_buf_size); + lv_color_t * map2 = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t)); + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); /*Go to the first displayed pixel of the map*/ lv_coord_t map_w = lv_area_get_width(map_area); @@ -502,7 +502,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, lv_blend_map(clip_area, &blend_area, map2, mask_buf, mask_res, opa, style->image.blend_mode); } - lv_draw_buf_release(mask_buf); - lv_draw_buf_release(map2); + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(map2); } } diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index e4b712971..609cc48a8 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -191,7 +191,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st uint32_t letter; uint32_t letter_next; #if LV_USE_BIDI - char *bidi_txt = lv_draw_buf_get(line_end - line_start + 1); + char *bidi_txt = lv_mem_buf_get(line_end - line_start + 1); lv_bidi_process_paragraph(txt + line_start, bidi_txt, line_end - line_start, bidi_dir, NULL, 0); #else const char *bidi_txt = txt + line_start; @@ -275,7 +275,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st } #if LV_USE_BIDI - lv_draw_buf_release(bidi_txt); + lv_mem_buf_release(bidi_txt); bidi_txt = NULL; #endif /*Go to next line*/ @@ -424,7 +424,7 @@ static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph col_bit = bit_ofs & 0x7; /* "& 0x7" equals to "% 8" just faster */ uint32_t mask_buf_size = g->box_w * g->box_h > LV_HOR_RES_MAX ? g->box_w * g->box_h : LV_HOR_RES_MAX; - lv_opa_t * mask_buf = lv_draw_buf_get(mask_buf_size); + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); lv_coord_t mask_p = 0; lv_coord_t mask_p_start; @@ -506,7 +506,7 @@ static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph mask_p = 0; } - lv_draw_buf_release(mask_buf); + lv_mem_buf_release(mask_buf); } static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, const uint8_t * map_p, lv_color_t color, lv_opa_t opa) @@ -562,10 +562,10 @@ static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_ col_bit = bit_ofs & 0x7; /* "& 0x7" equals to "% 8" just faster */ uint32_t mask_buf_size = g->box_w * g->box_h > LV_HOR_RES_MAX ? g->box_w * g->box_h : LV_HOR_RES_MAX; - lv_opa_t * mask_buf = lv_draw_buf_get(mask_buf_size); + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); lv_coord_t mask_p = 0; lv_coord_t mask_p_start; - lv_color_t * color_buf = lv_draw_buf_get(mask_buf_size * sizeof(lv_color_t)); + lv_color_t * color_buf = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t)); lv_disp_t * disp = lv_refr_get_disp_refreshing(); lv_disp_buf_t * vdb = lv_disp_get_buf(disp); @@ -697,8 +697,8 @@ static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_ lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, LV_BLEND_MODE_NORMAL); } - lv_draw_buf_release(mask_buf); - lv_draw_buf_release(color_buf); + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(color_buf); } diff --git a/src/lv_draw/lv_draw_rect.c b/src/lv_draw/lv_draw_rect.c index 316034e88..aa8f04cdf 100644 --- a/src/lv_draw/lv_draw_rect.c +++ b/src/lv_draw/lv_draw_rect.c @@ -137,7 +137,7 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s lv_coord_t draw_area_w = lv_area_get_width(&draw_area); /*Create a mask if there is a radius*/ - lv_opa_t * mask_buf = lv_draw_buf_get(draw_area_w); + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); bool simple_mode = true; if(lv_draw_mask_get_cnt()!= 0) simple_mode = false; @@ -178,7 +178,7 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s lv_color_t * grad_map = NULL; /*In case of horizontal gradient pre-compute a line with a gradient*/ if(style->body.grad_dir == LV_GRAD_DIR_HOR && style->body.main_color.full != style->body.grad_color.full) { - grad_map = lv_draw_buf_get(coords_w * sizeof(lv_color_t)); + grad_map = lv_mem_buf_get(coords_w * sizeof(lv_color_t)); lv_coord_t i; for(i = 0; i < coords_w; i++) { @@ -258,13 +258,13 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s fill_area.y2++; } - if(grad_map) lv_draw_buf_release(grad_map); + if(grad_map) lv_mem_buf_release(grad_map); } lv_draw_mask_remove_id(mask_rout_id); } - lv_draw_buf_release(mask_buf); + lv_mem_buf_release(mask_buf); } @@ -300,7 +300,7 @@ static void draw_border(const lv_area_t * coords, const lv_area_t * clip, const lv_coord_t draw_area_w = lv_area_get_width(&draw_area); /*Create a mask if there is a radius*/ - lv_opa_t * mask_buf = lv_draw_buf_get(draw_area_w); + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); bool simple_mode = true; if(lv_draw_mask_get_cnt()!= 0) simple_mode = false; @@ -468,7 +468,7 @@ static void draw_border(const lv_area_t * coords, const lv_area_t * clip, const } lv_draw_mask_remove_id(mask_rin_id); lv_draw_mask_remove_id(mask_rout_id); - lv_draw_buf_release(mask_buf); + lv_mem_buf_release(mask_buf); } static lv_color_t grad_get(const lv_style_t * style, lv_coord_t s, lv_coord_t i) @@ -555,7 +555,7 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_coord_t corner_size = sw + r_sh; - lv_opa_t * sh_buf = lv_draw_buf_get(corner_size * corner_size); + lv_opa_t * sh_buf = lv_mem_buf_get(corner_size * corner_size); shadow_draw_corner_buf(&sh_rect_area, sh_buf, style->body.shadow.width, r_sh); bool simple_mode = true; @@ -567,7 +567,7 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const /*Create a mask*/ lv_draw_mask_res_t mask_res; - lv_opa_t * mask_buf = lv_draw_buf_get(lv_area_get_width(&sh_rect_area)); + lv_opa_t * mask_buf = lv_mem_buf_get(lv_area_get_width(&sh_rect_area)); lv_draw_mask_radius_param_t mask_rout_param; lv_draw_mask_radius_init(&mask_rout_param, &bg_coords, r_bg, true); @@ -862,8 +862,8 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const } lv_draw_mask_remove_id(mask_rout_id); - lv_draw_buf_release(mask_buf); - lv_draw_buf_release(sh_buf); + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(sh_buf); } static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t sw, lv_coord_t r) @@ -892,8 +892,8 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_draw_mask_res_t mask_res; lv_coord_t y; - lv_opa_t * mask_line = lv_draw_buf_get(size); - uint16_t * sh_ups_buf = lv_draw_buf_get(size * size * sizeof(uint16_t)); + lv_opa_t * mask_line = lv_mem_buf_get(size); + uint16_t * sh_ups_buf = lv_mem_buf_get(size * size * sizeof(uint16_t)); uint16_t * sh_ups_tmp_buf = sh_ups_buf; for(y = 0; y < size; y++) { memset(mask_line, 0xFF, size); @@ -911,7 +911,7 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, sh_ups_tmp_buf += size; } - lv_draw_buf_release(mask_line); + lv_mem_buf_release(mask_line); // uint32_t k; // for(k = 0; k < size * size; k++) { @@ -924,7 +924,7 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, for(i = 0; i < size * size; i++) { sh_buf[i] = (sh_ups_buf[i] >> SHADOW_UPSACALE_SHIFT); } - lv_draw_buf_release(sh_ups_buf); + lv_mem_buf_release(sh_ups_buf); return; } @@ -933,7 +933,7 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, #if SHADOW_ENHANCE sw = sw_ori - sw; if(sw <= 1) { - lv_draw_buf_release(sh_ups_buf); + lv_mem_buf_release(sh_ups_buf); return; } @@ -947,7 +947,7 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, shadow_blur_corner(size, sw, sh_buf, sh_ups_buf); #endif - lv_draw_buf_release(sh_ups_buf); + lv_mem_buf_release(sh_ups_buf); } @@ -958,7 +958,7 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu if((sw & 1) == 0) s_left--; /*Horizontal blur*/ - uint16_t * sh_ups_hor_buf = lv_draw_buf_get(size * size * sizeof(uint16_t)); + uint16_t * sh_ups_hor_buf = lv_mem_buf_get(size * size * sizeof(uint16_t)); uint16_t * sh_ups_hor_buf_tmp; lv_coord_t x; @@ -1019,6 +1019,6 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu } } - lv_draw_buf_release(sh_ups_hor_buf); + lv_mem_buf_release(sh_ups_hor_buf); } diff --git a/src/lv_draw/lv_draw_triangle.c b/src/lv_draw/lv_draw_triangle.c index 7e9991240..36176e623 100644 --- a/src/lv_draw/lv_draw_triangle.c +++ b/src/lv_draw/lv_draw_triangle.c @@ -85,7 +85,7 @@ void lv_draw_polygon(const lv_point_t * points, uint16_t point_cnt, const lv_are } } - lv_draw_mask_line_param_t * mp = lv_draw_buf_get(sizeof(lv_draw_mask_line_param_t) * point_cnt); + lv_draw_mask_line_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_line_param_t) * point_cnt); lv_draw_mask_line_param_t * mp_next = mp; int32_t i_prev_left = y_min_i; @@ -157,7 +157,7 @@ void lv_draw_polygon(const lv_point_t * points, uint16_t point_cnt, const lv_are lv_draw_mask_remove_custom(mp); - lv_draw_buf_release(mp); + lv_mem_buf_release(mp); } diff --git a/src/lv_font/lv_font_fmt_txt.c b/src/lv_font/lv_font_fmt_txt.c index 7ed76b113..f8af216b4 100644 --- a/src/lv_font/lv_font_fmt_txt.c +++ b/src/lv_font/lv_font_fmt_txt.c @@ -317,8 +317,8 @@ static void decompress(const uint8_t * in, uint8_t * out, lv_coord_t w, lv_coord rle_init(in, bpp); - uint8_t * line_buf1 = lv_draw_buf_get(w); - uint8_t * line_buf2 = lv_draw_buf_get(w); + uint8_t * line_buf1 = lv_mem_buf_get(w); + uint8_t * line_buf2 = lv_mem_buf_get(w); decompress_line(line_buf1, w); @@ -339,8 +339,8 @@ static void decompress(const uint8_t * in, uint8_t * out, lv_coord_t w, lv_coord } } - lv_draw_buf_release(line_buf1); - lv_draw_buf_release(line_buf2); + lv_mem_buf_release(line_buf1); + lv_mem_buf_release(line_buf2); } /** diff --git a/src/lv_misc/lv_gc.h b/src/lv_misc/lv_gc.h index 87d33d391..64bc178f3 100644 --- a/src/lv_misc/lv_gc.h +++ b/src/lv_misc/lv_gc.h @@ -42,7 +42,7 @@ extern "C" { prefix lv_ll_t _lv_img_defoder_ll; \ prefix lv_img_cache_entry_t * _lv_img_cache_array; \ prefix void * _lv_task_act; \ - prefix lv_draw_buf_t _lv_draw_buf[LV_DRAW_BUF_MAX_NUM]; \ + prefix lv_mem_buf_t _lv_mem_buf[LV_MEM_BUF_MAX_NUM]; \ #define LV_NO_PREFIX #define LV_ROOTS LV_GC_ROOTS(LV_NO_PREFIX) diff --git a/src/lv_misc/lv_mem.c b/src/lv_misc/lv_mem.c index 116208ea8..7ad041366 100644 --- a/src/lv_misc/lv_mem.c +++ b/src/lv_misc/lv_mem.c @@ -9,6 +9,7 @@ *********************/ #include "lv_mem.h" #include "lv_math.h" +#include "lv_gc.h" #include #if LV_MEM_CUSTOM != 0 @@ -375,6 +376,73 @@ uint32_t lv_mem_get_size(const void * data) #endif /*LV_ENABLE_GC*/ +/** + * Get a temporal buffer with the given size. + * @param size the required size + */ +void * lv_mem_buf_get(uint32_t size) +{ + /*Try to find a free buffer with suitable size */ + uint8_t i; + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].used == 0 && _lv_mem_buf[i].size >= size) { + _lv_mem_buf[i].used = 1; + return _lv_mem_buf[i].p; + } + } + + /*Reallocate a free buffer*/ + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].used == 0) { + _lv_mem_buf[i].used = 1; + _lv_mem_buf[i].size = size; + /*if this fails you probably need to increase your LV_MEM_SIZE/heap size*/ + _lv_mem_buf[i].p = lv_mem_realloc(_lv_mem_buf[i].p, size); + if(_lv_mem_buf[i].p == NULL) { + LV_LOG_ERROR("lv_mem_buf_get: Out of memory, can't allocate a new buffer (increase your LV_MEM_SIZE/heap size)") + } + return _lv_mem_buf[i].p; + } + } + + LV_LOG_ERROR("lv_mem_buf_get: no free buffer. Increase LV_DRAW_BUF_MAX_NUM."); + + return NULL; +} + +/** + * Release a memory buffer + * @param p buffer to release + */ +void lv_mem_buf_release(void * p) +{ + uint8_t i; + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].p == p) { + _lv_mem_buf[i].used = 0; + return; + } + } + + LV_LOG_ERROR("lv_mem_buf_release: p is not a known buffer") +} + +/** + * Free all memory buffers + */ +void lv_mem_buf_free_all(void) +{ + uint8_t i; + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].p) { + lv_mem_free(_lv_mem_buf[i].p); + _lv_mem_buf[i].p = NULL; + _lv_mem_buf[i].used = 0; + _lv_mem_buf[i].size = 0; + } + } +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/lv_misc/lv_mem.h b/src/lv_misc/lv_mem.h index 2353122ee..6300cdd16 100644 --- a/src/lv_misc/lv_mem.h +++ b/src/lv_misc/lv_mem.h @@ -38,6 +38,10 @@ extern "C" { #endif #endif +#ifndef LV_MEM_BUF_MAX_NUM +#define LV_MEM_BUF_MAX_NUM 16 +#endif + /********************** * TYPEDEFS **********************/ @@ -56,6 +60,12 @@ typedef struct uint8_t frag_pct; /**< Amount of fragmentation */ } lv_mem_monitor_t; +typedef struct { + void * p; + uint16_t size; + uint8_t used :1; +}lv_mem_buf_t; + /********************** * GLOBAL PROTOTYPES **********************/ @@ -106,6 +116,23 @@ void lv_mem_monitor(lv_mem_monitor_t * mon_p); */ uint32_t lv_mem_get_size(const void * data); +/** + * Get a temporal buffer with the given size. + * @param size the required size + */ +void * lv_mem_buf_get(uint32_t size); + +/** + * Release a memory buffer + * @param p buffer to release + */ +void lv_mem_buf_release(void * p); + +/** + * Free all memory buffers + */ +void lv_mem_buf_free_all(void); + /********************** * MACROS **********************/ diff --git a/src/lv_objx/lv_canvas.c b/src/lv_objx/lv_canvas.c index efb991e9b..627b8ecf2 100644 --- a/src/lv_objx/lv_canvas.c +++ b/src/lv_objx/lv_canvas.c @@ -433,7 +433,7 @@ void lv_canvas_blur_hor(lv_obj_t * canvas, const lv_area_t * area, uint16_t r) bool has_alpha = lv_img_cf_has_alpha(ext->dsc.header.cf); lv_coord_t line_w = lv_img_buf_get_img_size(ext->dsc.header.w, 1, ext->dsc.header.cf); - uint8_t * line_buf = lv_draw_buf_get(line_w); + uint8_t * line_buf = lv_mem_buf_get(line_w); lv_img_dsc_t line_img; line_img.data = line_buf; @@ -526,7 +526,7 @@ void lv_canvas_blur_hor(lv_obj_t * canvas, const lv_area_t * area, uint16_t r) } lv_obj_invalidate(canvas); - lv_draw_buf_release(line_buf); + lv_mem_buf_release(line_buf); } @@ -567,7 +567,7 @@ void lv_canvas_blur_ver(lv_obj_t * canvas, const lv_area_t * area, uint16_t r) bool has_alpha = lv_img_cf_has_alpha(ext->dsc.header.cf); lv_coord_t col_w = lv_img_buf_get_img_size(1, ext->dsc.header.h, ext->dsc.header.cf); - uint8_t * col_buf = lv_draw_buf_get(col_w); + uint8_t * col_buf = lv_mem_buf_get(col_w); lv_img_dsc_t line_img; line_img.data = col_buf; @@ -665,7 +665,7 @@ void lv_canvas_blur_ver(lv_obj_t * canvas, const lv_area_t * area, uint16_t r) lv_obj_invalidate(canvas); - lv_draw_buf_release(col_buf); + lv_mem_buf_release(col_buf); } /** diff --git a/src/lv_objx/lv_label.c b/src/lv_objx/lv_label.c index 26d7324f9..2eb686d7e 100644 --- a/src/lv_objx/lv_label.c +++ b/src/lv_objx/lv_label.c @@ -731,7 +731,7 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) } #if LV_USE_BIDI - bidi_txt = lv_draw_buf_get(new_line_start - line_start + 1); + bidi_txt = lv_mem_buf_get(new_line_start - line_start + 1); uint16_t txt_len = new_line_start - line_start; if(bidi_txt[new_line_start] == '\0') txt_len--; lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_base_dir(label), NULL, 0); @@ -787,7 +787,7 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) } #if LV_USE_BIDI - lv_draw_buf_release(bidi_txt); + lv_mem_buf_release(bidi_txt); /*Handle Bidi*/ bool is_rtl; logical_pos = lv_bidi_get_logical_pos(&txt[line_start], NULL, txt_len, lv_obj_get_base_dir(label), lv_txt_encoded_get_char_id(bidi_txt, i), &is_rtl); diff --git a/src/lv_objx/lv_objmask.c b/src/lv_objx/lv_objmask.c index 29292e7ea..ef4694a22 100644 --- a/src/lv_objx/lv_objmask.c +++ b/src/lv_objx/lv_objmask.c @@ -223,7 +223,7 @@ static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * c if(dsc->type == LV_DRAW_MASK_TYPE_LINE) { lv_draw_mask_line_param_t * p_ori = m->param; - lv_draw_mask_line_param_t * p_new = lv_draw_buf_get(sizeof(lv_draw_mask_line_param_t)); + lv_draw_mask_line_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_line_param_t)); lv_draw_mask_line_points_init(p_new, p_ori->cfg.p1.x + xofs, p_ori->cfg.p1.y + yofs, p_ori->cfg.p2.x + xofs, p_ori->cfg.p2.y + yofs, @@ -232,7 +232,7 @@ static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * c } else if(dsc->type == LV_DRAW_MASK_TYPE_ANGLE) { lv_draw_mask_angle_param_t * p_ori = m->param; - lv_draw_mask_angle_param_t * p_new = lv_draw_buf_get(sizeof(lv_draw_mask_angle_param_t)); + lv_draw_mask_angle_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_angle_param_t)); lv_draw_mask_angle_init(p_new, p_ori->cfg.vertex_p.x + xofs, p_ori->cfg.vertex_p.y + yofs, p_ori->cfg.start_angle, p_ori->cfg.end_angle); @@ -240,7 +240,7 @@ static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * c } else if(dsc->type == LV_DRAW_MASK_TYPE_RADIUS) { lv_draw_mask_radius_param_t * p_ori = m->param; - lv_draw_mask_radius_param_t * p_new = lv_draw_buf_get(sizeof(lv_draw_mask_radius_param_t)); + lv_draw_mask_radius_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t)); lv_area_t rect; rect.x1 = p_ori->cfg.rect.x1 + xofs; @@ -253,7 +253,7 @@ static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * c } else if(dsc->type == LV_DRAW_MASK_TYPE_FADE) { lv_draw_mask_fade_param_t * p_ori = m->param; - lv_draw_mask_fade_param_t * p_new = lv_draw_buf_get(sizeof(lv_draw_mask_fade_param_t)); + lv_draw_mask_fade_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_fade_param_t)); lv_area_t rect; rect.x1 = p_ori->cfg.coords.x1 + xofs; @@ -267,7 +267,7 @@ static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * c } else if(dsc->type == LV_DRAW_MASK_TYPE_MAP) { lv_draw_mask_map_param_t * p_ori = m->param; - lv_draw_mask_map_param_t * p_new = lv_draw_buf_get(sizeof(lv_draw_mask_map_param_t)); + lv_draw_mask_map_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_map_param_t)); lv_area_t rect; rect.x1 = p_ori->cfg.coords.x1 + xofs; @@ -292,7 +292,7 @@ static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * c LV_LL_READ(ext->mask_ll, m) { void * param; param = lv_draw_mask_remove_custom(m->param); - lv_draw_buf_release(param); + lv_mem_buf_release(param); } } diff --git a/src/lv_objx/lv_page.c b/src/lv_objx/lv_page.c index fd6c30452..6682b7f80 100644 --- a/src/lv_objx/lv_page.c +++ b/src/lv_objx/lv_page.c @@ -706,7 +706,7 @@ static lv_design_res_t lv_page_design(lv_obj_t * page, const lv_area_t * clip_ar if(style->body.corner_mask) { style = lv_page_get_style(page, LV_PAGE_STYLE_BG); - lv_draw_mask_radius_param_t * mp = lv_draw_buf_get(sizeof(lv_draw_mask_radius_param_t));; + lv_draw_mask_radius_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t));; lv_draw_mask_radius_init(mp, &page->coords, style->body.radius, false); /*Add the mask and use `page+8` as custom id. Don't use `page` directly because it might be sued by the user*/ lv_draw_mask_add(mp, page + 8); @@ -783,7 +783,7 @@ static lv_design_res_t lv_page_design(lv_obj_t * page, const lv_area_t * clip_ar if(style->body.corner_mask) { void * param = lv_draw_mask_remove_custom(page + 8); - lv_draw_buf_release(param); + lv_mem_buf_release(param); } #endif }