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
This commit is contained in:
Gabor Kiss-Vamosi
2019-11-19 06:25:14 +01:00
parent 12c722b38e
commit b4dae16e22
16 changed files with 161 additions and 208 deletions

View File

@@ -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);
}
}

View File

@@ -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");
}

View File

@@ -1,116 +0,0 @@
/**
* @file lv_draw.c
*
*/
/*********************
* INCLUDES
*********************/
#include <stdio.h>
#include <stdbool.h>
#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
**********************/

View File

@@ -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" */

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}
/**

View File

@@ -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)

View File

@@ -9,6 +9,7 @@
*********************/
#include "lv_mem.h"
#include "lv_math.h"
#include "lv_gc.h"
#include <string.h>
#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
**********************/

View File

@@ -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
**********************/

View File

@@ -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);
}
/**

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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
}