mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-28 07:03:00 +08:00
feat(decoder): add decoder open args (#4834)
Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
parent
534768ed27
commit
695f4e9247
@ -343,7 +343,8 @@ to open is an animation.
|
|||||||
|
|
||||||
lv_result_t res;
|
lv_result_t res;
|
||||||
lv_image_decoder_dsc_t dsc;
|
lv_image_decoder_dsc_t dsc;
|
||||||
res = lv_image_decoder_open(&dsc, &my_img_dsc, color, frame_id);
|
lv_image_decoder_args_t args = { 0 }; /*Custom decoder behavior via args*/
|
||||||
|
res = lv_image_decoder_open(&dsc, &my_img_dsc, &args);
|
||||||
|
|
||||||
if(res == LV_RESULT_OK) {
|
if(res == LV_RESULT_OK) {
|
||||||
/*Do something with `dsc->img_data`*/
|
/*Do something with `dsc->img_data`*/
|
||||||
@ -457,7 +458,7 @@ See the detailed code below:
|
|||||||
{
|
{
|
||||||
...
|
...
|
||||||
lv_image_decoder_dsc_t decoder_dsc;
|
lv_image_decoder_dsc_t decoder_dsc;
|
||||||
lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, draw_dsc->recolor, -1);
|
lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL);
|
||||||
if(res != LV_RESULT_OK) {
|
if(res != LV_RESULT_OK) {
|
||||||
LV_LOG_ERROR("Failed to open image");
|
LV_LOG_ERROR("Failed to open image");
|
||||||
return;
|
return;
|
||||||
|
@ -90,9 +90,8 @@ lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * head
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, lv_color_t color, int32_t frame_id)
|
lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(color);
|
|
||||||
lv_memzero(dsc, sizeof(lv_image_decoder_dsc_t));
|
lv_memzero(dsc, sizeof(lv_image_decoder_dsc_t));
|
||||||
|
|
||||||
if(src == NULL) return LV_RESULT_INVALID;
|
if(src == NULL) return LV_RESULT_INVALID;
|
||||||
@ -103,7 +102,7 @@ lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src
|
|||||||
}
|
}
|
||||||
|
|
||||||
dsc->src_type = src_type;
|
dsc->src_type = src_type;
|
||||||
dsc->frame_id = frame_id;
|
if(args) dsc->frame_id = args->frame_id;
|
||||||
|
|
||||||
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
||||||
size_t fnlen = lv_strlen(src);
|
size_t fnlen = lv_strlen(src);
|
||||||
@ -122,6 +121,20 @@ lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src
|
|||||||
lv_result_t res = LV_RESULT_INVALID;
|
lv_result_t res = LV_RESULT_INVALID;
|
||||||
|
|
||||||
lv_image_decoder_t * decoder;
|
lv_image_decoder_t * decoder;
|
||||||
|
lv_image_decoder_args_t * args_copy = NULL;
|
||||||
|
|
||||||
|
/*Make a copy of args */
|
||||||
|
if(args) {
|
||||||
|
args_copy = lv_malloc(sizeof(lv_image_decoder_args_t));
|
||||||
|
LV_ASSERT_MALLOC(args_copy);
|
||||||
|
if(args_copy == NULL) {
|
||||||
|
LV_LOG_WARN("Out of memory");
|
||||||
|
return LV_RESULT_INVALID;
|
||||||
|
}
|
||||||
|
lv_memcpy(args_copy, args, sizeof(lv_image_decoder_args_t));
|
||||||
|
dsc->args = args_copy;
|
||||||
|
}
|
||||||
|
|
||||||
_LV_LL_READ(img_decoder_ll_p, decoder) {
|
_LV_LL_READ(img_decoder_ll_p, decoder) {
|
||||||
/*Info and Open callbacks are required*/
|
/*Info and Open callbacks are required*/
|
||||||
if(decoder->info_cb == NULL || decoder->open_cb == NULL) continue;
|
if(decoder->info_cb == NULL || decoder->open_cb == NULL) continue;
|
||||||
@ -132,7 +145,7 @@ lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src
|
|||||||
if(dsc->header.stride == 0) dsc->header.stride = img_width_to_stride(&dsc->header);
|
if(dsc->header.stride == 0) dsc->header.stride = img_width_to_stride(&dsc->header);
|
||||||
|
|
||||||
dsc->decoder = decoder;
|
dsc->decoder = decoder;
|
||||||
res = decoder->open_cb(decoder, dsc);
|
res = decoder->open_cb(decoder, dsc, args);
|
||||||
|
|
||||||
/*Opened successfully. It is a good decoder for this image source*/
|
/*Opened successfully. It is a good decoder for this image source*/
|
||||||
if(res == LV_RESULT_OK) return res;
|
if(res == LV_RESULT_OK) return res;
|
||||||
@ -150,6 +163,8 @@ lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src
|
|||||||
if(dsc->src_type == LV_IMAGE_SRC_FILE)
|
if(dsc->src_type == LV_IMAGE_SRC_FILE)
|
||||||
lv_free((void *)dsc->src);
|
lv_free((void *)dsc->src);
|
||||||
|
|
||||||
|
if(args_copy) lv_free(args_copy);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,6 +193,7 @@ void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc)
|
|||||||
{
|
{
|
||||||
if(dsc->decoder) {
|
if(dsc->decoder) {
|
||||||
if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc);
|
if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc);
|
||||||
|
if(dsc->args) lv_free(dsc->args);
|
||||||
|
|
||||||
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
||||||
lv_free((void *)dsc->src);
|
lv_free((void *)dsc->src);
|
||||||
|
@ -49,6 +49,22 @@ struct _lv_image_decoder_dsc_t;
|
|||||||
struct _lv_image_decoder_t;
|
struct _lv_image_decoder_t;
|
||||||
struct _lv_cache_entry_t;
|
struct _lv_cache_entry_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Image decoder args.
|
||||||
|
* It determines how to decoder an image, e.g. whether to premultiply the alpha or not.
|
||||||
|
* It should be passed to lv_img_decoder_open() function. If NULL is provided, default
|
||||||
|
* args are used.
|
||||||
|
*
|
||||||
|
* Default args:
|
||||||
|
* all field are zero or false.
|
||||||
|
*/
|
||||||
|
typedef struct _lv_image_decoder_args_t {
|
||||||
|
int32_t frame_id; /*A not use args*/
|
||||||
|
bool stride_align; /*Whether stride should be aligned*/
|
||||||
|
bool premultiply; /*Whether image should be premultiplied or not after decoding*/
|
||||||
|
bool no_cache; /*Whether this image should be kept out of cache*/
|
||||||
|
} lv_image_decoder_args_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get info from an image and store in the `header`
|
* Get info from an image and store in the `header`
|
||||||
* @param src the image source. Can be a pointer to a C array or a file name (Use
|
* @param src the image source. Can be a pointer to a C array or a file name (Use
|
||||||
@ -63,9 +79,11 @@ typedef lv_result_t (*lv_image_decoder_info_f_t)(struct _lv_image_decoder_t * de
|
|||||||
* Open an image for decoding. Prepare it as it is required to read it later
|
* Open an image for decoding. Prepare it as it is required to read it later
|
||||||
* @param decoder pointer to the decoder the function associated with
|
* @param decoder pointer to the decoder the function associated with
|
||||||
* @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it.
|
* @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it.
|
||||||
|
* @param args arguments of how to decode the image. see `lv_image_decoder_args_t`.
|
||||||
*/
|
*/
|
||||||
typedef lv_result_t (*lv_image_decoder_open_f_t)(struct _lv_image_decoder_t * decoder,
|
typedef lv_result_t (*lv_image_decoder_open_f_t)(struct _lv_image_decoder_t * decoder,
|
||||||
struct _lv_image_decoder_dsc_t * dsc);
|
struct _lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`.
|
* Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`.
|
||||||
@ -103,6 +121,9 @@ typedef struct _lv_image_decoder_dsc_t {
|
|||||||
/**The decoder which was able to open the image source*/
|
/**The decoder which was able to open the image source*/
|
||||||
lv_image_decoder_t * decoder;
|
lv_image_decoder_t * decoder;
|
||||||
|
|
||||||
|
/*A copy of parameters of how this image is decoded*/
|
||||||
|
lv_image_decoder_args_t * args;
|
||||||
|
|
||||||
/**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/
|
/**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/
|
||||||
const void * src;
|
const void * src;
|
||||||
|
|
||||||
@ -172,11 +193,11 @@ lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * head
|
|||||||
* 2) Variable: Pointer to an `lv_image_dsc_t` variable
|
* 2) Variable: Pointer to an `lv_image_dsc_t` variable
|
||||||
* 3) Symbol: E.g. `LV_SYMBOL_OK`
|
* 3) Symbol: E.g. `LV_SYMBOL_OK`
|
||||||
* @param color The color of the image with `LV_IMAGE_CF_ALPHA_...`
|
* @param color The color of the image with `LV_IMAGE_CF_ALPHA_...`
|
||||||
* @param frame_id the index of the frame. Used only with animated images, set 0 for normal images
|
* @param args args about how the image should be opened.
|
||||||
* @return LV_RESULT_OK: opened the image. `dsc->img_data` and `dsc->header` are set.
|
* @return LV_RESULT_OK: opened the image. `dsc->img_data` and `dsc->header` are set.
|
||||||
* LV_RESULT_INVALID: none of the registered image decoders were able to open the image.
|
* LV_RESULT_INVALID: none of the registered image decoders were able to open the image.
|
||||||
*/
|
*/
|
||||||
lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, lv_color_t color, int32_t frame_id);
|
lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode an area of the opened image
|
* Decode an area of the opened image
|
||||||
|
@ -124,7 +124,7 @@ void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, c
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lv_image_decoder_dsc_t decoder_dsc;
|
lv_image_decoder_dsc_t decoder_dsc;
|
||||||
lv_image_decoder_open(&decoder_dsc, dsc->img_src, dsc->color, 0);
|
lv_image_decoder_open(&decoder_dsc, dsc->img_src, NULL);
|
||||||
img_area.x1 = 0;
|
img_area.x1 = 0;
|
||||||
img_area.y1 = 0;
|
img_area.y1 = 0;
|
||||||
img_area.x2 = decoder_dsc.header.w - 1;
|
img_area.x2 = decoder_dsc.header.w - 1;
|
||||||
|
@ -195,7 +195,7 @@ static void img_draw_normal(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_
|
|||||||
}
|
}
|
||||||
|
|
||||||
lv_image_decoder_dsc_t decoder_dsc;
|
lv_image_decoder_dsc_t decoder_dsc;
|
||||||
lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, draw_dsc->recolor, -1);
|
lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL);
|
||||||
if(res != LV_RESULT_OK) {
|
if(res != LV_RESULT_OK) {
|
||||||
LV_LOG_ERROR("Failed to open image");
|
LV_LOG_ERROR("Failed to open image");
|
||||||
return;
|
return;
|
||||||
@ -210,7 +210,7 @@ static void img_draw_tiled(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
|
|||||||
const lv_area_t * coords)
|
const lv_area_t * coords)
|
||||||
{
|
{
|
||||||
lv_image_decoder_dsc_t decoder_dsc;
|
lv_image_decoder_dsc_t decoder_dsc;
|
||||||
lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, draw_dsc->recolor, -1);
|
lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL);
|
||||||
if(res != LV_RESULT_OK) {
|
if(res != LV_RESULT_OK) {
|
||||||
LV_LOG_ERROR("Failed to open image");
|
LV_LOG_ERROR("Failed to open image");
|
||||||
return;
|
return;
|
||||||
|
@ -291,7 +291,7 @@ static void _set_paint_fill_pattern(Tvg_Paint * obj, Tvg_Canvas * canvas, const
|
|||||||
const lv_matrix_t * m)
|
const lv_matrix_t * m)
|
||||||
{
|
{
|
||||||
lv_image_decoder_dsc_t decoder_dsc;
|
lv_image_decoder_dsc_t decoder_dsc;
|
||||||
lv_result_t res = lv_image_decoder_open(&decoder_dsc, p->src, p->recolor, -1);
|
lv_result_t res = lv_image_decoder_open(&decoder_dsc, p->src, NULL);
|
||||||
if(res != LV_RESULT_OK) {
|
if(res != LV_RESULT_OK) {
|
||||||
LV_LOG_ERROR("Failed to open image");
|
LV_LOG_ERROR("Failed to open image");
|
||||||
return;
|
return;
|
||||||
|
@ -134,11 +134,14 @@ lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, const void * src,
|
|||||||
* Open a lvgl binary image
|
* Open a lvgl binary image
|
||||||
* @param decoder the decoder where this function belongs
|
* @param decoder the decoder where this function belongs
|
||||||
* @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it.
|
* @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it.
|
||||||
|
* @param args arguments of how to decode the image.
|
||||||
* @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error.
|
* @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error.
|
||||||
*/
|
*/
|
||||||
lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(decoder);
|
LV_UNUSED(decoder);
|
||||||
|
LV_UNUSED(args);
|
||||||
lv_fs_res_t res = LV_RESULT_INVALID;
|
lv_fs_res_t res = LV_RESULT_INVALID;
|
||||||
|
|
||||||
/*Open the file if it's a file*/
|
/*Open the file if it's a file*/
|
||||||
|
@ -50,7 +50,8 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
|
|||||||
* @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it.
|
* @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it.
|
||||||
* @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error.
|
* @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error.
|
||||||
*/
|
*/
|
||||||
lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the pending decoding. Free resources etc.
|
* Close the pending decoding. Free resources etc.
|
||||||
|
@ -32,7 +32,8 @@ typedef struct {
|
|||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
|
|
||||||
static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
const lv_area_t * full_area, lv_area_t * decoded_area);
|
const lv_area_t * full_area, lv_area_t * decoded_area);
|
||||||
@ -139,9 +140,11 @@ static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src,
|
|||||||
* @param style style of the image object (unused now but certain formats might use it)
|
* @param style style of the image object (unused now but certain formats might use it)
|
||||||
* @return pointer to the decoded image or `LV_IMAGE_DECODER_OPEN_FAIL` if failed
|
* @return pointer to the decoded image or `LV_IMAGE_DECODER_OPEN_FAIL` if failed
|
||||||
*/
|
*/
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(decoder);
|
LV_UNUSED(decoder);
|
||||||
|
LV_UNUSED(args);
|
||||||
|
|
||||||
/*If it's a PNG file...*/
|
/*If it's a PNG file...*/
|
||||||
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
||||||
|
@ -66,7 +66,8 @@ struct lv_image_pixel_color_s {
|
|||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
||||||
|
|
||||||
static struct ffmpeg_context_s * ffmpeg_open_file(const char * path);
|
static struct ffmpeg_context_s * ffmpeg_open_file(const char * path);
|
||||||
@ -268,9 +269,11 @@ static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src,
|
|||||||
return LV_RESULT_INVALID;
|
return LV_RESULT_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(decoder);
|
LV_UNUSED(decoder);
|
||||||
|
LV_UNUSED(args);
|
||||||
|
|
||||||
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
|
||||||
const char * path = dsc->src;
|
const char * path = dsc->src;
|
||||||
|
@ -33,7 +33,8 @@ typedef struct error_mgr_s {
|
|||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
||||||
static const void * decode_jpeg_file(const char * filename);
|
static const void * decode_jpeg_file(const char * filename);
|
||||||
static bool get_jpeg_size(const char * filename, uint32_t * width, uint32_t * height);
|
static bool get_jpeg_size(const char * filename, uint32_t * width, uint32_t * height);
|
||||||
@ -146,9 +147,11 @@ static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src,
|
|||||||
* @param style style of the image object (unused now but certain formats might use it)
|
* @param style style of the image object (unused now but certain formats might use it)
|
||||||
* @return pointer to the decoded image or `LV_IMAGE_DECODER_OPEN_FAIL` if failed
|
* @return pointer to the decoded image or `LV_IMAGE_DECODER_OPEN_FAIL` if failed
|
||||||
*/
|
*/
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(decoder); /*Unused*/
|
LV_UNUSED(decoder); /*Unused*/
|
||||||
|
LV_UNUSED(args); /*Unused*/
|
||||||
|
|
||||||
/*Check the cache first*/
|
/*Check the cache first*/
|
||||||
if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
|
if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
|
||||||
|
@ -24,7 +24,8 @@
|
|||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
||||||
static const void * decode_png_file(const char * filename);
|
static const void * decode_png_file(const char * filename);
|
||||||
static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc);
|
static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc);
|
||||||
@ -121,9 +122,11 @@ static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src,
|
|||||||
* @param style style of the image object (unused now but certain formats might use it)
|
* @param style style of the image object (unused now but certain formats might use it)
|
||||||
* @return pointer to the decoded image or `LV_IMAGE_DECODER_OPEN_FAIL` if failed
|
* @return pointer to the decoded image or `LV_IMAGE_DECODER_OPEN_FAIL` if failed
|
||||||
*/
|
*/
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(decoder); /*Unused*/
|
LV_UNUSED(decoder); /*Unused*/
|
||||||
|
LV_UNUSED(args); /*Unused*/
|
||||||
|
|
||||||
/*Check the cache first*/
|
/*Check the cache first*/
|
||||||
if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
|
if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
|
||||||
|
@ -28,7 +28,8 @@ typedef struct {
|
|||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
static lv_result_t decoder_info(struct _lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
static lv_result_t decoder_info(struct _lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
||||||
static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt);
|
static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt);
|
||||||
static const void * decode_png_data(const void * png_data, size_t png_data_size);
|
static const void * decode_png_data(const void * png_data, size_t png_data_size);
|
||||||
@ -154,9 +155,11 @@ static lv_result_t decoder_info(struct _lv_image_decoder_t * decoder, const void
|
|||||||
* @param dsc decoded image descriptor
|
* @param dsc decoded image descriptor
|
||||||
* @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image
|
* @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image
|
||||||
*/
|
*/
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
(void) decoder; /*Unused*/
|
LV_UNUSED(decoder);
|
||||||
|
LV_UNUSED(args);
|
||||||
|
|
||||||
/*Check the cache first*/
|
/*Check the cache first*/
|
||||||
if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
|
if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
|
||||||
|
@ -53,8 +53,8 @@ typedef struct {
|
|||||||
**********************/
|
**********************/
|
||||||
static lv_res_t decoder_info(struct _lv_image_decoder_t * decoder,
|
static lv_res_t decoder_info(struct _lv_image_decoder_t * decoder,
|
||||||
const void * src, lv_image_header_t * header);
|
const void * src, lv_image_header_t * header);
|
||||||
static lv_res_t decoder_open(lv_image_decoder_t * dec,
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
lv_image_decoder_dsc_t * dsc);
|
const lv_image_decoder_args_t * args);
|
||||||
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@ -452,9 +452,10 @@ static inline lv_res_t decode_from_variable(lv_image_decoder_t * decoder,
|
|||||||
return LV_RES_OK;
|
return LV_RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static lv_res_t decoder_open(lv_image_decoder_t * decoder,
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
lv_image_decoder_dsc_t * dsc)
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
|
LV_UNUSED(args);
|
||||||
lv_fs_res_t res;
|
lv_fs_res_t res;
|
||||||
lv_rle_file_header_t fileheader;
|
lv_rle_file_header_t fileheader;
|
||||||
lv_rle_decoder_data_t * data;
|
lv_rle_decoder_data_t * data;
|
||||||
@ -491,7 +492,7 @@ static lv_res_t decoder_open(lv_image_decoder_t * decoder,
|
|||||||
data->decoder_dsc.src_type = LV_IMAGE_SRC_VARIABLE;
|
data->decoder_dsc.src_type = LV_IMAGE_SRC_VARIABLE;
|
||||||
data->decoder_dsc.src = &data->img_dsc;
|
data->decoder_dsc.src = &data->img_dsc;
|
||||||
|
|
||||||
res = lv_bin_decoder_open(decoder, &data->decoder_dsc);
|
res = lv_bin_decoder_open(decoder, &data->decoder_dsc, dsc->args);
|
||||||
if(res != LV_RES_OK) {
|
if(res != LV_RES_OK) {
|
||||||
lv_free(img_data);
|
lv_free(img_data);
|
||||||
lv_free(data);
|
lv_free(data);
|
||||||
|
@ -27,7 +27,8 @@
|
|||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
**********************/
|
**********************/
|
||||||
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args);
|
||||||
|
|
||||||
static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
const lv_area_t * full_area, lv_area_t * decoded_area);
|
const lv_area_t * full_area, lv_area_t * decoded_area);
|
||||||
@ -142,9 +143,11 @@ static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc,
|
||||||
|
const lv_image_decoder_args_t * args)
|
||||||
{
|
{
|
||||||
LV_UNUSED(decoder);
|
LV_UNUSED(decoder);
|
||||||
|
LV_UNUSED(args);
|
||||||
lv_fs_file_t * f = lv_malloc(sizeof(lv_fs_file_t));
|
lv_fs_file_t * f = lv_malloc(sizeof(lv_fs_file_t));
|
||||||
if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) {
|
if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) {
|
||||||
#if LV_USE_FS_MEMFS
|
#if LV_USE_FS_MEMFS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user