fix(snapshot): make snapshot work again
Support inly true color, true color alpha and a8 formats
This commit is contained in:
@@ -8,13 +8,10 @@ Simply call API `lv_snapshot_take` to generate the image descriptor which can be
|
|||||||
|
|
||||||
|
|
||||||
Note, only below color formats are supported for now:
|
Note, only below color formats are supported for now:
|
||||||
|
- LV_IMG_CF_TRUE_COLOR
|
||||||
- LV_IMG_CF_TRUE_COLOR_ALPHA
|
- LV_IMG_CF_TRUE_COLOR_ALPHA
|
||||||
- LV_IMG_CF_ALPHA_1BIT
|
|
||||||
- LV_IMG_CF_ALPHA_2BIT
|
|
||||||
- LV_IMG_CF_ALPHA_4BIT
|
|
||||||
- LV_IMG_CF_ALPHA_8BIT
|
- LV_IMG_CF_ALPHA_8BIT
|
||||||
|
|
||||||
|
|
||||||
### Free the Image
|
### Free the Image
|
||||||
The memory `lv_snapshot_take` uses are dynamically allocated using `lv_mem_alloc`. Use API `lv_snapshot_free` to free the memory it takes. This will firstly free memory the image data takes, then the image descriptor.
|
The memory `lv_snapshot_take` uses are dynamically allocated using `lv_mem_alloc`. Use API `lv_snapshot_free` to free the memory it takes. This will firstly free memory the image data takes, then the image descriptor.
|
||||||
|
|
||||||
|
|||||||
@@ -49,12 +49,10 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf)
|
|||||||
switch(cf) {
|
switch(cf) {
|
||||||
case LV_IMG_CF_TRUE_COLOR:
|
case LV_IMG_CF_TRUE_COLOR:
|
||||||
case LV_IMG_CF_TRUE_COLOR_ALPHA:
|
case LV_IMG_CF_TRUE_COLOR_ALPHA:
|
||||||
case LV_IMG_CF_ALPHA_1BIT:
|
|
||||||
case LV_IMG_CF_ALPHA_2BIT:
|
|
||||||
case LV_IMG_CF_ALPHA_4BIT:
|
|
||||||
case LV_IMG_CF_ALPHA_8BIT:
|
case LV_IMG_CF_ALPHA_8BIT:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
LV_LOG_WARN("Not supported color format");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,9 +64,11 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf)
|
|||||||
lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj);
|
lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj);
|
||||||
w += ext_size * 2;
|
w += ext_size * 2;
|
||||||
h += ext_size * 2;
|
h += ext_size * 2;
|
||||||
|
uint8_t px_size;
|
||||||
|
if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) px_size = LV_IMG_PX_SIZE_ALPHA_BYTE;
|
||||||
|
else px_size = sizeof(lv_color_t);
|
||||||
|
|
||||||
uint8_t px_size = lv_img_cf_get_px_size(cf);
|
return w * h * px_size;
|
||||||
return w * h * ((px_size + 7) >> 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Take snapshot for object with its children, save image info to provided buffer.
|
/** Take snapshot for object with its children, save image info to provided buffer.
|
||||||
@@ -90,17 +90,14 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
|
|||||||
switch(cf) {
|
switch(cf) {
|
||||||
case LV_IMG_CF_TRUE_COLOR:
|
case LV_IMG_CF_TRUE_COLOR:
|
||||||
case LV_IMG_CF_TRUE_COLOR_ALPHA:
|
case LV_IMG_CF_TRUE_COLOR_ALPHA:
|
||||||
case LV_IMG_CF_ALPHA_1BIT:
|
|
||||||
case LV_IMG_CF_ALPHA_2BIT:
|
|
||||||
case LV_IMG_CF_ALPHA_4BIT:
|
|
||||||
case LV_IMG_CF_ALPHA_8BIT:
|
case LV_IMG_CF_ALPHA_8BIT:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
LV_LOG_WARN("Not supported color format");
|
||||||
return LV_RES_INV;
|
return LV_RES_INV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lv_snapshot_buf_size_needed(obj, cf) > buff_size)
|
if(lv_snapshot_buf_size_needed(obj, cf) > buff_size) return LV_RES_INV;
|
||||||
return LV_RES_INV;
|
|
||||||
|
|
||||||
/*Width and height determine snapshot image size.*/
|
/*Width and height determine snapshot image size.*/
|
||||||
lv_coord_t w = lv_obj_get_width(obj);
|
lv_coord_t w = lv_obj_get_width(obj);
|
||||||
@@ -115,6 +112,11 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
|
|||||||
|
|
||||||
lv_memset(buf, 0x00, buff_size);
|
lv_memset(buf, 0x00, buff_size);
|
||||||
lv_memzero(dsc, sizeof(lv_img_dsc_t));
|
lv_memzero(dsc, sizeof(lv_img_dsc_t));
|
||||||
|
dsc->data = buf;
|
||||||
|
dsc->header.w = w;
|
||||||
|
dsc->header.h = h;
|
||||||
|
dsc->header.cf = cf;
|
||||||
|
|
||||||
|
|
||||||
lv_disp_t * obj_disp = lv_obj_get_disp(obj);
|
lv_disp_t * obj_disp = lv_obj_get_disp(obj);
|
||||||
lv_disp_drv_t driver;
|
lv_disp_drv_t driver;
|
||||||
@@ -122,7 +124,7 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
|
|||||||
/*In lack of a better idea use the resolution of the object's display*/
|
/*In lack of a better idea use the resolution of the object's display*/
|
||||||
driver.hor_res = lv_disp_get_hor_res(obj_disp);
|
driver.hor_res = lv_disp_get_hor_res(obj_disp);
|
||||||
driver.ver_res = lv_disp_get_hor_res(obj_disp);
|
driver.ver_res = lv_disp_get_hor_res(obj_disp);
|
||||||
lv_disp_drv_use_generic_set_px_cb(&driver, cf);
|
|
||||||
|
|
||||||
lv_disp_t fake_disp;
|
lv_disp_t fake_disp;
|
||||||
lv_memzero(&fake_disp, sizeof(lv_disp_t));
|
lv_memzero(&fake_disp, sizeof(lv_disp_t));
|
||||||
@@ -136,6 +138,10 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
|
|||||||
draw_ctx->clip_area = &snapshot_area;
|
draw_ctx->clip_area = &snapshot_area;
|
||||||
draw_ctx->buf_area = &snapshot_area;
|
draw_ctx->buf_area = &snapshot_area;
|
||||||
draw_ctx->buf = (void *)buf;
|
draw_ctx->buf = (void *)buf;
|
||||||
|
if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) draw_ctx->color_format = LV_COLOR_FORMAT_L8;
|
||||||
|
else if(dsc->header.cf != LV_IMG_CF_TRUE_COLOR_ALPHA) draw_ctx->render_with_alpha = false;
|
||||||
|
else draw_ctx->render_with_alpha = true;
|
||||||
|
|
||||||
driver.draw_ctx = draw_ctx;
|
driver.draw_ctx = draw_ctx;
|
||||||
|
|
||||||
lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing();
|
lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing();
|
||||||
@@ -143,14 +149,12 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t *
|
|||||||
|
|
||||||
lv_obj_redraw(draw_ctx, obj);
|
lv_obj_redraw(draw_ctx, obj);
|
||||||
|
|
||||||
|
if(draw_ctx->buffer_convert) draw_ctx->buffer_convert(draw_ctx);
|
||||||
|
|
||||||
_lv_refr_set_disp_refreshing(refr_ori);
|
_lv_refr_set_disp_refreshing(refr_ori);
|
||||||
obj_disp->driver->draw_ctx_deinit(fake_disp.driver, draw_ctx);
|
obj_disp->driver->draw_ctx_deinit(fake_disp.driver, draw_ctx);
|
||||||
lv_free(draw_ctx);
|
lv_free(draw_ctx);
|
||||||
|
|
||||||
dsc->data = buf;
|
|
||||||
dsc->header.w = w;
|
|
||||||
dsc->header.h = h;
|
|
||||||
dsc->header.cf = cf;
|
|
||||||
return LV_RES_OK;
|
return LV_RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user