refactor(draw_buff): separate all image cache related draw buff into image_cache_draw_buff

This commit is contained in:
Benign X
2024-05-05 18:00:06 +08:00
committed by Neo Xu
parent d2abf237c3
commit 417d78bead
9 changed files with 45 additions and 17 deletions

View File

@@ -101,6 +101,8 @@ typedef struct _lv_global_t {
lv_draw_buf_handlers_t draw_buf_handlers;
lv_draw_buf_handlers_t font_draw_buf_handlers;
lv_draw_buf_handlers_t image_cache_draw_buf_handlers; /**< Ensure that all assigned draw buffers
* can be managed by image cache. */
lv_ll_t img_decoder_ll;

View File

@@ -17,6 +17,7 @@
*********************/
#define default_handlers LV_GLOBAL_DEFAULT()->draw_buf_handlers
#define font_draw_buf_handlers LV_GLOBAL_DEFAULT()->font_draw_buf_handlers
#define image_cache_draw_buf_handlers LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers
/**********************
* TYPEDEFS
@@ -51,6 +52,7 @@ void _lv_draw_buf_init_handlers(void)
{
lv_draw_buf_init_with_default_handlers(&default_handlers);
lv_draw_buf_init_with_default_handlers(&font_draw_buf_handlers);
lv_draw_buf_init_with_default_handlers(&image_cache_draw_buf_handlers);
}
void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers)

View File

@@ -19,6 +19,7 @@
#define img_decoder_ll_p &(LV_GLOBAL_DEFAULT()->img_decoder_ll)
#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache)
#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache)
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
/**********************
* TYPEDEFS
@@ -237,7 +238,8 @@ lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_d
LV_LOG_TRACE("Stride mismatch");
lv_result_t res = lv_draw_buf_adjust_stride(decoded, stride_expect);
if(res != LV_RESULT_OK) {
lv_draw_buf_t * aligned = lv_draw_buf_create(decoded->header.w, decoded->header.h, decoded->header.cf, stride_expect);
lv_draw_buf_t * aligned = lv_draw_buf_create_user(image_cache_draw_buf_handlers, decoded->header.w, decoded->header.h,
decoded->header.cf, stride_expect);
if(aligned == NULL) {
LV_LOG_ERROR("No memory for Stride adjust.");
return NULL;
@@ -261,7 +263,7 @@ lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_d
lv_draw_buf_premultiply(decoded);
}
else {
decoded = lv_draw_buf_dup(decoded);
decoded = lv_draw_buf_dup_user(image_cache_draw_buf_handlers, decoded);
if(decoded == NULL) {
LV_LOG_ERROR("No memory for premulitplying.");
return NULL;

View File

@@ -21,6 +21,8 @@
#define DECODER_NAME "VG_LITE"
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
/* VG_LITE_INDEX1, 2, and 4 require endian flipping + bit flipping,
* so for simplicity, they are uniformly converted to I8 for display.
*/
@@ -210,7 +212,8 @@ static lv_result_t decoder_open_variable(lv_image_decoder_t * decoder, lv_image_
}
/* create draw buf */
lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, DEST_IMG_FORMAT, LV_STRIDE_AUTO);
lv_draw_buf_t * draw_buf = lv_draw_buf_create_user(image_cache_draw_buf_handlers, width, height, DEST_IMG_FORMAT,
LV_STRIDE_AUTO);
if(draw_buf == NULL) {
return LV_RESULT_INVALID;
}
@@ -277,7 +280,8 @@ static lv_result_t decoder_open_file(lv_image_decoder_t * decoder, lv_image_deco
return LV_RESULT_INVALID;
}
lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, DEST_IMG_FORMAT, LV_STRIDE_AUTO);
lv_draw_buf_t * draw_buf = lv_draw_buf_create_user(image_cache_draw_buf_handlers, width, height, DEST_IMG_FORMAT,
LV_STRIDE_AUTO);
if(draw_buf == NULL) {
lv_fs_close(&file);
return LV_RESULT_INVALID;

View File

@@ -12,6 +12,7 @@
#include "../../stdlib/lv_string.h"
#include "../../stdlib/lv_sprintf.h"
#include "../../libs/rle/lv_rle.h"
#include "../../core/lv_global.h"
#if LV_USE_LZ4_EXTERNAL
#include <lz4.h>
@@ -27,6 +28,8 @@
#define DECODER_NAME "BIN"
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
/**********************
* TYPEDEFS
**********************/
@@ -415,7 +418,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
lv_draw_buf_destroy(decoder_data->decoded_partial);
decoder_data->decoded_partial = NULL;
}
decoded = lv_draw_buf_create(w_px, 1, cf_decoded, LV_STRIDE_AUTO);
decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, w_px, 1, cf_decoded, LV_STRIDE_AUTO);
if(decoded == NULL) return LV_RESULT_INVALID;
decoder_data->decoded_partial = decoded; /*Free on decoder close*/
}
@@ -585,7 +588,8 @@ static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder
decoder_data->palette = (void *)palette; /*Need to free when decoder closes*/
#if LV_BIN_DECODER_RAM_LOAD
draw_buf_indexed = lv_draw_buf_create(dsc->header.w, dsc->header.h, cf, dsc->header.stride);
draw_buf_indexed = lv_draw_buf_create_user(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf,
dsc->header.stride);
if(draw_buf_indexed == NULL) {
LV_LOG_ERROR("Draw buffer alloc failed");
goto exit_with_buf;
@@ -623,8 +627,9 @@ static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder
#if LV_BIN_DECODER_RAM_LOAD
/*Convert to ARGB8888, since sw renderer cannot render it directly even it's in RAM*/
lv_draw_buf_t * decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_ARGB8888,
0);
lv_draw_buf_t * decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h,
LV_COLOR_FORMAT_ARGB8888,
0);
if(decoded == NULL) {
LV_LOG_ERROR("No memory for indexed image");
goto exit_with_buf;
@@ -715,7 +720,8 @@ static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_d
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
lv_color_format_t cf = dsc->header.cf;
lv_fs_file_t * f = decoder_data->f;
lv_draw_buf_t * decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, cf, dsc->header.stride);
lv_draw_buf_t * decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf,
dsc->header.stride);
if(decoded == NULL) {
LV_LOG_ERROR("Draw buffer alloc failed");
return LV_RESULT_INVALID;
@@ -772,7 +778,8 @@ static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc
len += (dsc->header.stride / 2) * dsc->header.h; /*A8 mask*/
}
lv_draw_buf_t * decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, cf, dsc->header.stride);
lv_draw_buf_t * decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf,
dsc->header.stride);
if(decoded == NULL) {
LV_LOG_ERROR("No memory for rgb file read");
return LV_RESULT_INVALID;
@@ -824,7 +831,8 @@ static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_deco
lv_draw_buf_t * decoded;
uint32_t file_len = (uint32_t)dsc->header.stride * dsc->header.h;
decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_A8, buf_stride);
decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_A8,
buf_stride);
if(decoded == NULL) {
LV_LOG_ERROR("Out of memory");
return LV_RESULT_INVALID;
@@ -1078,8 +1086,9 @@ static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image
LV_UNUSED(input_len);
LV_UNUSED(out_len);
lv_draw_buf_t * decompressed = lv_draw_buf_create(dsc->header.w, dsc->header.h, dsc->header.cf,
dsc->header.stride);
lv_draw_buf_t * decompressed = lv_draw_buf_create_user(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h,
dsc->header.cf,
dsc->header.stride);
if(decompressed == NULL) {
LV_LOG_WARN("No memory for decompressed image, input: %" LV_PRIu32 ", output: %" LV_PRIu32, input_len, out_len);
return LV_RESULT_INVALID;

View File

@@ -17,6 +17,8 @@
#define DECODER_NAME "BMP"
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
/**********************
* TYPEDEFS
**********************/
@@ -208,7 +210,7 @@ static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
decoded = NULL;
dsc->decoded = NULL;
}
decoded = lv_draw_buf_create(w_px, 1, dsc->header.cf, LV_STRIDE_AUTO);
decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, w_px, 1, dsc->header.cf, LV_STRIDE_AUTO);
if(decoded == NULL) return LV_RESULT_INVALID;
}
else {

View File

@@ -21,6 +21,8 @@
#define DECODER_NAME "JPEG_TURBO"
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
#define JPEG_PIXEL_SIZE 3 /* RGB888 */
#define JPEG_SIGNATURE 0xFFD8FF
#define IS_JPEG_SIGNATURE(x) (((x) & 0x00FFFFFF) == JPEG_SIGNATURE)
@@ -374,7 +376,8 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
uint32_t buf_width = (image_angle % 180) ? cinfo.output_height : cinfo.output_width;
uint32_t buf_height = (image_angle % 180) ? cinfo.output_width : cinfo.output_height;
decoded = lv_draw_buf_create(buf_width, buf_height, LV_COLOR_FORMAT_RGB888, LV_STRIDE_AUTO);
decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, buf_width, buf_height, LV_COLOR_FORMAT_RGB888,
LV_STRIDE_AUTO);
if(decoded != NULL) {
uint32_t line_index = 0;
/* while (scan lines remain to be read) */

View File

@@ -19,6 +19,8 @@
#define DECODER_NAME "PNG"
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
/**********************
* TYPEDEFS
**********************/
@@ -278,7 +280,7 @@ static lv_draw_buf_t * decode_png_file(lv_image_decoder_dsc_t * dsc, const char
/*Alloc image buffer*/
lv_draw_buf_t * decoded;
decoded = lv_draw_buf_create(image.width, image.height, cf, LV_STRIDE_AUTO);
decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, image.width, image.height, cf, LV_STRIDE_AUTO);
if(decoded == NULL) {
LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), filename);
lv_free(data);

View File

@@ -31,6 +31,8 @@ Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for
#include "lodepng.h"
#if LV_USE_LODEPNG
#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers)
#ifdef LODEPNG_COMPILE_DISK
#include <limits.h> /* LONG_MAX */
#endif /* LODEPNG_COMPILE_DISK */
@@ -5307,7 +5309,7 @@ static void decodeGeneric(unsigned char ** out, unsigned * w, unsigned * h,
lodepng_free(idat);
if(!state->error) {
lv_draw_buf_t * decoded = lv_draw_buf_create(*w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w);
lv_draw_buf_t * decoded = lv_draw_buf_create_user(image_cache_draw_buf_handlers, *w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w);
if(decoded) {
*out = (unsigned char*)decoded;
outsize = decoded->data_size;