fix(bin_decoder): fix memory leak (#5990)
This commit is contained in:
@@ -244,6 +244,7 @@ open/close the PNG files. It should look like this:
|
||||
lv_image_decoder_t * dec = lv_image_decoder_create();
|
||||
lv_image_decoder_set_info_cb(dec, decoder_info);
|
||||
lv_image_decoder_set_open_cb(dec, decoder_open);
|
||||
lv_image_decoder_set_get_area_cb(dec, decoder_get_area);
|
||||
lv_image_decoder_set_close_cb(dec, decoder_close);
|
||||
|
||||
|
||||
@@ -280,7 +281,7 @@ open/close the PNG files. It should look like this:
|
||||
/*Check whether the type `src` is known by the decoder*/
|
||||
if(is_png(dsc->src) == false) return LV_RESULT_INVALID;
|
||||
|
||||
/*Decode and store the image. If `dsc->decoded` is `NULL`, the `read_line` function will be called to get the image data line-by-line*/
|
||||
/*Decode and store the image. If `dsc->decoded` is `NULL`, the `decoder_get_area` function will be called to get the image data line-by-line*/
|
||||
dsc->decoded = my_png_decoder(dsc->src);
|
||||
|
||||
/*Change the color format if decoded image format is different than original format. For PNG it's usually decoded to ARGB8888 format*/
|
||||
@@ -296,13 +297,58 @@ open/close the PNG files. It should look like this:
|
||||
* Decode an area of image
|
||||
* @param decoder pointer to the decoder where this function belongs
|
||||
* @param dsc image decoder descriptor
|
||||
* @param full_area full image area information
|
||||
* @param decoded_area area information to decode (x1, y1, x2, y2)
|
||||
* @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't decode image area
|
||||
* @param full_area input parameter. the full area to decode after enough subsequent calls
|
||||
* @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding.
|
||||
* the decoded area is stored here after each call.
|
||||
* @return LV_RESULT_OK: ok; LV_RESULT_INVALID: failed or there is nothing left to decode
|
||||
*/
|
||||
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)
|
||||
{
|
||||
/**
|
||||
* If `dsc->decoded` is always set in `decoder_open` then `decoder_get_area` does not need to be implemented.
|
||||
* If `dsc->decoded` is only sometimes set or never set in `decoder_open` then `decoder_get_area` is used to
|
||||
* incrementally decode the image by calling it repeatedly until it returns `LV_RESULT_INVALID`.
|
||||
* In the example below the image is decoded line-by-line but the decoded area can have any shape and size
|
||||
* depending on the requirements and capabilities of the image decoder.
|
||||
*/
|
||||
|
||||
my_decoder_data_t * my_decoder_data = dsc->user_data;
|
||||
|
||||
/* if `decoded_area` has a field set to `LV_COORD_MIN` then reset decoding */
|
||||
if(decoded_area->y1 == LV_COORD_MIN) {
|
||||
decoded_area->x1 = full_area->x1;
|
||||
decoded_area->x2 = full_area->x2;
|
||||
decoded_area->y1 = full_area->y1;
|
||||
decoded_area->y2 = decoded_area->y1; /* decode line-by-line, starting with the first line */
|
||||
|
||||
/* create a draw buf the size of one line */
|
||||
bool reshape_success = NULL != lv_draw_buf_reshape(my_decoder_data->partial,
|
||||
dsc->decoded.header.cf,
|
||||
lv_area_get_width(full_area),
|
||||
1,
|
||||
LV_STRIDE_AUTO);
|
||||
if(!reshape_success) {
|
||||
lv_draw_buf_destroy(my_decoder_data->partial);
|
||||
my_decoder_data->partial = lv_draw_buf_create(lv_area_get_width(full_area),
|
||||
1,
|
||||
dsc->decoded.header.cf,
|
||||
LV_STRIDE_AUTO);
|
||||
|
||||
my_png_decode_line_reset(full_area);
|
||||
}
|
||||
}
|
||||
/* otherwise decoding is already in progress. decode the next line */
|
||||
else {
|
||||
/* all lines have already been decoded. indicate completion by returning `LV_RESULT_INVALID` */
|
||||
if (decoded_area->y1 >= full_area->y2) return LV_RESULT_INVALID;
|
||||
decoded_area->y1++;
|
||||
decoded_area->y2++;
|
||||
}
|
||||
|
||||
my_png_decode_line(my_decoder_data->partial);
|
||||
|
||||
return LV_RESULT_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -314,8 +360,12 @@ open/close the PNG files. It should look like this:
|
||||
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
|
||||
{
|
||||
/*Free all allocated data*/
|
||||
my_png_cleanup();
|
||||
|
||||
/*Call the built-in close function if the built-in open/read_line was used*/
|
||||
my_decoder_data_t * my_decoder_data = dsc->user_data;
|
||||
lv_draw_buf_destroy(my_decoder_data->partial);
|
||||
|
||||
/*Call the built-in close function if the built-in open/get_area was used*/
|
||||
lv_bin_decoder_close(decoder, dsc);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user