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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
**********************/
|
||||
@@ -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" */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
**********************/
|
||||
|
||||
@@ -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
|
||||
**********************/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user