1.Linux修改:视频水印改为与图片水印一样;

This commit is contained in:
payton 2023-12-04 14:30:36 +08:00
parent e33afe0f54
commit 6809f6646a
3 changed files with 361 additions and 8 deletions

View File

@ -1052,8 +1052,9 @@
/* please always fill ARGB8888, alpha channel will be discarded if output format is yuv (Photo UIDateImprint) */ /* please always fill ARGB8888, alpha channel will be discarded if output format is yuv (Photo UIDateImprint) */
#define LV_USER_CFG_STAMP_COLOR_TEXT 0xFFFFFFFF /* text color */ #define LV_USER_CFG_STAMP_COLOR_TEXT 0xFFFFFFFF /* text color */
#define LV_USER_CFG_STAMP_COLOR_BACKGROUND 0XFF000000 /* background color: black */ #define LV_USER_CFG_STAMP_COLOR_BACKGROUND 0XFF000000 /* background color: black */
#define LV_USER_CFG_MOVIE_DATESTAMP_COLOR_BACKGROUND 0X00000000 /* background color: none */ #define LV_USER_CFG_MOVIE_DATESTAMP_COLOR_BACKGROUND 0XFF000000 /* background color: none */
#define LV_USER_CFG_STAMP_COLOR_FRAME 0x00000000 /* frame color */ #define LV_USER_CFG_STAMP_COLOR_FRAME 0x00000000 /* frame color */
#define LV_USER_CFG_MOVIE_STAMP_COLOR_BACKGROUND 0XF000 /* background color: black */
/******************************************************************************************* /*******************************************************************************************
* Enable LVGL rotate depend on VDO_USE_ROTATE_BUFFER (LV_USE_GPU_NVT_DMA2D in the lv_conf.h should be enabled) * Enable LVGL rotate depend on VDO_USE_ROTATE_BUFFER (LV_USE_GPU_NVT_DMA2D in the lv_conf.h should be enabled)

View File

@ -18,6 +18,8 @@
#include "ImageApp/ImageApp_MovieMulti.h" #include "ImageApp/ImageApp_MovieMulti.h"
#include "vf_gfx.h" #include "vf_gfx.h"
#include "GxTime.h" #include "GxTime.h"
#include "sf_common.h"
#include "UIApp/Photo/UIDateImprint.h"
#if MOVIE_ISP_LOG #if MOVIE_ISP_LOG
#include "vendor_isp.h" #include "vendor_isp.h"
@ -132,6 +134,7 @@ static WATERLOGO_BUFFER g_sMultiWaterLogo[VIDEO_IN_MAX][MOVIE_MULTI_WATERLOG
#define LV_USER_FONT_CONV_ALIGN_W 8 #define LV_USER_FONT_CONV_ALIGN_W 8
#define LV_USER_FONT_CONV_ALIGN_H 2 #define LV_USER_FONT_CONV_ALIGN_H 2
#define LV_USER_ICON_CONV_ALIGN_W 2
static inline uint32_t lv_color4444_to32(lv_user_color4444_t color) static inline uint32_t lv_color4444_to32(lv_user_color4444_t color)
{ {
@ -534,7 +537,11 @@ void MovieStamp_Setup(UINT32 uiVEncOutPortId, UINT32 uiFlag, UINT32 uiImageWidth
// break; // break;
// } // }
if (uiImageWidth >= 4608) if(uiImageWidth >= 5632)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_24M;
}
else if(uiImageWidth >= 4608)
{ {
red_id = LV_USER_CFG_STAMP_FONT_ID_16M; red_id = LV_USER_CFG_STAMP_FONT_ID_16M;
} }
@ -1002,15 +1009,289 @@ UINT32 MovieStamp_CalcBufSize(UINT32 Width, UINT32 Height, WATERLOGO_BUFFER *pWa
return BufSize; return BufSize;
} }
/* YUV color key */
#define CKEY_Y 0x0
#define CKEY_U 0x88
#define CKEY_V 0x88
void MovieStamp_SelStampFont(UINT32 uiImageWidth, lv_font_t** font)
{
lv_plugin_res_id red_id;
if(uiImageWidth >= 5632)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_24M;
}
else if(uiImageWidth >= 4608)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_16M;
}
else if(uiImageWidth >= 4032)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_12M;
}
else if(uiImageWidth >= 3264)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_8M;
}
else if(uiImageWidth >= 1920)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_LARGE;
}
else if(uiImageWidth >= 1080)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_MEDIUM;
}
else if(uiImageWidth >= 1024)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_SMALL_PIC;
}
else if(uiImageWidth >= 640)
{
red_id = LV_USER_CFG_STAMP_FONT_ID_SMALL;
}
else
{
red_id = LV_USER_CFG_STAMP_FONT_ID_XS;
}
//printf("[%s:%d]uiImageWidth=%d,red_id=%d\n", __FUNCTION__, __LINE__, uiImageWidth, red_id);
*font = (lv_font_t*)lv_plugin_get_font(red_id)->font;
}
void MovieStamp_AttachString(
UINT32 stamp_height,
HD_VIDEO_FRAME* Img,
char* name,
lv_font_t* font,
bool enable_ckey,
UINT32 padding,
UINT32* x_curr_ofs)
{
VF_GFX_SCALE param_img = {0};
HD_VIDEO_FRAME src_img;
HD_VIDEO_PXLFMT out_fmt = HD_VIDEO_PXLFMT_ARGB4444;
void *va;
UINT32 pa;
HD_RESULT ret;
HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0;
/******************************************************************************
* Stamp image
******************************************************************************/
lv_user_font_conv_draw_cfg draw_cfg = {0};
lv_user_font_conv_calc_buffer_size_result buff_size = {0};
lv_user_font_conv_mem_cfg mem_cfg = {0};
lv_color32_t color32;
draw_cfg.align_w = LV_USER_FONT_CONV_ALIGN_W;
draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H;
draw_cfg.fmt = out_fmt;
draw_cfg.mode = LV_USER_FONT_CONV_DRAW_TEXT;
draw_cfg.radius = LV_USER_CFG_STAMP_RADIUS;
draw_cfg.string.letter_space = LV_USER_CFG_STAMP_LETTER_SPACE;
draw_cfg.string.align = LV_USER_CFG_STAMP_TEXT_ALIGN;
draw_cfg.string.text = name;
draw_cfg.string.font = font;
draw_cfg.ext_w = LV_USER_CFG_STAMP_EXT_WIDTH;
draw_cfg.ext_h = LV_USER_CFG_STAMP_EXT_HEIGHT;
draw_cfg.border.width = LV_USER_CFG_STAMP_BORDER_WIDTH;
/* text color */
color32.full = LV_USER_CFG_STAMP_COLOR_TEXT;
draw_cfg.string.color = LV_COLOR_MAKE(color32.ch.red, color32.ch.green, color32.ch.blue);
draw_cfg.string.opa = LV_COLOR_GET_A32(color32);
/* bg color */
color32.full = LV_USER_CFG_STAMP_COLOR_BACKGROUND;
draw_cfg.bg.color = LV_COLOR_MAKE(color32.ch.red, color32.ch.green, color32.ch.blue);
draw_cfg.bg.opa = LV_COLOR_GET_A32(color32);
/* border color */
color32.full = LV_USER_CFG_STAMP_COLOR_FRAME;
draw_cfg.border.color = LV_COLOR_MAKE(color32.ch.red, color32.ch.green, color32.ch.blue);
draw_cfg.border.opa = LV_COLOR_GET_A32(color32);
draw_cfg.border.width = LV_USER_CFG_STAMP_BORDER_WIDTH;
draw_cfg.enable_ckey = enable_ckey;
draw_cfg.key_y = CKEY_Y;
draw_cfg.key_u = CKEY_U;
draw_cfg.key_v = CKEY_V;
lv_user_font_conv_calc_buffer_size(&draw_cfg, &buff_size);
ret = hd_common_mem_alloc("stamp_string", &pa, (void **)&va, buff_size.output_buffer_size, ddr_id);
if (ret != HD_OK) {
DBG_ERR("custom_stamp_buffer allocate failed\n\r");
}
else {
mem_cfg.output_buffer = va;
mem_cfg.output_buffer_size = buff_size.output_buffer_size;
}
lv_user_font_conv(&draw_cfg, &mem_cfg);
lv_user_font_conv_cfg_to_hd_frame(
&draw_cfg,
&mem_cfg,
buff_size.width,
buff_size.height,
&src_img
);
memset(&param_img, 0, sizeof(param_img));
param_img.quality = HD_GFX_SCALE_QUALITY_NULL;
param_img.src_img = src_img;
param_img.src_region.x = 0;
param_img.src_region.y = 0;
param_img.src_region.w = src_img.dim.w;
param_img.src_region.h = src_img.dim.h;
param_img.engine = 0;
param_img.dst_img = *Img;
param_img.dst_region.w = (src_img.dim.w / src_img.dim.h) * stamp_height;
param_img.dst_region.h = stamp_height;
param_img.dst_region.x = (*x_curr_ofs - padding - param_img.dst_region.w);
param_img.dst_region.y = param_img.dst_img.dim.h - param_img.dst_region.h;
vf_gfx_scale(&param_img, 1);
*x_curr_ofs = param_img.dst_region.x;
hd_common_mem_free(pa, va);
}
void MovieStamp_AttachICON(
UINT32 stamp_height,
UINT32 stamp_pos_y,
HD_VIDEO_FRAME* Img,
lv_plugin_res_id res_id,
bool enable_ckey,
UINT32 padding,
UINT32* x_curr_ofs)
{
HD_VIDEO_PXLFMT out_fmt = HD_VIDEO_PXLFMT_ARGB4444;
HD_VIDEO_FRAME src_img;
void *va;
UINT32 pa;
HD_RESULT ret;
HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0;
/******************************************************************************
* Stamp image
******************************************************************************/
lv_user_font_conv_draw_cfg draw_cfg = {0};
lv_user_font_conv_calc_buffer_size_result buff_size = {0};
lv_user_font_conv_mem_cfg mem_cfg = {0};
lv_user_font_conv_draw_cfg_init(&draw_cfg);
draw_cfg.align_w = LV_USER_ICON_CONV_ALIGN_W;
draw_cfg.align_h = LV_USER_FONT_CONV_ALIGN_H;
draw_cfg.fmt = out_fmt;
draw_cfg.mode = LV_USER_FONT_CONV_DRAW_IMG;
#if LV_COLOR_DEPTH == 8
extern uint32_t palette_define[];
draw_cfg.img.palette = palette_define;
#else
draw_cfg.img.palette = NULL;
#endif
draw_cfg.img.id = res_id;
draw_cfg.enable_ckey = enable_ckey;
draw_cfg.key_y = CKEY_Y;
draw_cfg.key_u = CKEY_U;
draw_cfg.key_v = CKEY_V;
lv_user_font_conv_calc_buffer_size(&draw_cfg, &buff_size);
ret = hd_common_mem_alloc("stamp_icon", &pa, (void **)&va, buff_size.output_buffer_size, ddr_id);
if (ret != HD_OK) {
DBG_ERR("custom_stamp_buffer allocate failed\n\r");
}
else {
mem_cfg.output_buffer = va;
mem_cfg.output_buffer_size = buff_size.output_buffer_size;
}
/***********************************************************
* draw image
**********************************************************/
VF_GFX_SCALE param_img = {0};
lv_user_font_conv(&draw_cfg, &mem_cfg);
lv_user_font_conv_cfg_to_hd_frame(
&draw_cfg,
&mem_cfg,
buff_size.width,
buff_size.height,
&src_img
);
hd_common_mem_flush_cache(mem_cfg.output_buffer, mem_cfg.output_buffer_size);
memset(&param_img, 0, sizeof(param_img));
param_img.quality = HD_GFX_SCALE_QUALITY_NULL;
param_img.src_img = src_img;
param_img.src_region.x = 0;
param_img.src_region.y = 0;
param_img.src_region.w = src_img.dim.w;
param_img.src_region.h = src_img.dim.h;
param_img.engine = 0;
param_img.dst_img = *Img;
param_img.dst_region.w = (src_img.dim.w * stamp_height/ src_img.dim.h);
param_img.dst_region.h = stamp_height;
param_img.dst_region.x = (*x_curr_ofs - padding - param_img.dst_region.w);
param_img.dst_region.y = stamp_pos_y;
vf_gfx_scale(&param_img, 1);
hd_common_mem_free(pa, va);
*x_curr_ofs = param_img.dst_region.x;
}
void sf_get_movie_resolution_ratio_str(char *movieRatioStr)
{
UIMenuStoreInfo *puiPara = sf_ui_para_get();
if(puiPara->VideoSize == MOVIE_SIZE_FRONT_1920x1080P30)
{
sprintf((char *)movieRatioStr, "1080P");
}
else if(puiPara->VideoSize == MOVIE_SIZE_FRONT_1280x720P30)
{
sprintf((char *)movieRatioStr, "720P");
}
else if(puiPara->VideoSize == MOVIE_SIZE_FRONT_848x480P30)
{
sprintf((char *)movieRatioStr, "WVGA");
}
else
{
sprintf((char *)movieRatioStr, "WVGA");
}
}
void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color) void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color)
{ {
UINT32 size; UINT32 size;
UINT32 combined_stamp_w = g_ImageSize[vid_in].w; UINT32 combined_stamp_w = g_ImageSize[vid_in].w;
UINT32 combined_stamp_h = g_VsOsdHight[vid_in]; UINT32 combined_stamp_h = g_VsOsdHight[vid_in];
UINT32 combined_stamp_pos_y = 0;
size = combined_stamp_w * combined_stamp_h * 2; /* ARGB4444 */ size = combined_stamp_w * combined_stamp_h * 2; /* ARGB4444 */
HD_COMMON_MEM_VIRT_INFO vir_info = {0}; HD_COMMON_MEM_VIRT_INFO vir_info = {0};
UINT32 padding = 20;
UINT32 x_curr_ofs = 0; /* start from date stamp */
HD_VIDEO_FRAME Img = {0};
UINT32 lineoff[HD_VIDEO_MAX_PLANE] = {0};
UINT32 addr[HD_VIDEO_MAX_PLANE] = {0};
char name[16]; char name[16];
INT16 cTemper = 0;
INT16 fTemper = 0;
char customString[32] = {0};
INT32 year = 0, month = 0, day = 0;
UINT8 moonday = 0;
UINT8 batValue = 0;
sprintf(name, "mov_stamp%lu", vid_in); sprintf(name, "mov_stamp%lu", vid_in);
@ -1025,7 +1306,11 @@ void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color)
memset((void *)combined_stamp_addr[vid_in].pool_va, 0, size); memset((void *)combined_stamp_addr[vid_in].pool_va, 0, size);
/* draw bg */ lineoff[0] = combined_stamp_w * 2;
addr[0] = combined_stamp_addr[vid_in].pool_pa;
vf_init_ex(&Img, combined_stamp_w, combined_stamp_h, HD_VIDEO_PXLFMT_ARGB4444, lineoff, addr);
//draw stamp background.
HD_GFX_DRAW_RECT rect = {0}; HD_GFX_DRAW_RECT rect = {0};
rect.color = bg_color; rect.color = bg_color;
@ -1039,7 +1324,7 @@ void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color)
rect.dst_img.p_phy_addr[0] = combined_stamp_addr[vid_in].pool_pa; /* argb4444 accept virtual address */ rect.dst_img.p_phy_addr[0] = combined_stamp_addr[vid_in].pool_pa; /* argb4444 accept virtual address */
hd_gfx_draw_rect(&rect); hd_gfx_draw_rect(&rect);
/* copy date stamp to bg */ /*date stamp*/
HD_GFX_COPY copy = {0}; HD_GFX_COPY copy = {0};
copy.alpha = 255; copy.alpha = 255;
copy.colorkey = 0; copy.colorkey = 0;
@ -1061,7 +1346,7 @@ void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color)
copy.src_region = (HD_IRECT) {0, 0, copy.src_img.dim.w, copy.src_img.dim.h}; copy.src_region = (HD_IRECT) {0, 0, copy.src_img.dim.w, copy.src_img.dim.h};
hd_gfx_copy(&copy); hd_gfx_copy(&copy);
/* copy water logo to bg */ /*water logo*/
UINT32 water_size = g_MovieWaterInfo[vid_in].uiWidth * g_MovieWaterInfo[vid_in].uiHeight * 2; UINT32 water_size = g_MovieWaterInfo[vid_in].uiWidth * g_MovieWaterInfo[vid_in].uiHeight * 2;
if(water_logo_addr[vid_in].pool_va == 0){ if(water_logo_addr[vid_in].pool_va == 0){
@ -1096,6 +1381,72 @@ void MovieStamp_CombineStamp(UINT32 vid_in, UINT32 bg_color)
scale.dst_region.y = 0; scale.dst_region.y = 0;
hd_gfx_scale(&scale); hd_gfx_scale(&scale);
x_curr_ofs = combined_stamp_w - g_VsFontOut[vid_in].GenImg.dim.w;
/*temperature stamp*/
lv_font_t* font = NULL;
MovieStamp_SelStampFont(combined_stamp_w, &font);
sf_stamp_temperature_get(&fTemper, &cTemper);
snprintf((char *)customString, sizeof(customString), "%d%c%cF %d%c%cC", fTemper, 0xC2, 0xB0, cTemper, 0xC2, 0xB0);
//printf("[%s:%d]customString=%s\n", __FUNCTION__, __LINE__, customString);
MovieStamp_AttachString(combined_stamp_h, &Img, customString, font, false, padding, &x_curr_ofs);
/*moon stamp*/
year = DateTime_Get(DATETIME_YEAR);
month = DateTime_Get(DATETIME_MONTH);
day = DateTime_Get(DATETIME_DAY);
//printf("[%s:%d]get date time:%04d %02d %02d\n", __FUNCTION__, __LINE__, year, month, day);
moonday = (sf_solar_to_Lunar(year, month, day)) - 1;
MovieStamp_AttachICON(combined_stamp_h, combined_stamp_pos_y, &Img, LV_PLUGIN_IMG_ID_ICON_10200_MOON + moonday, false, padding, &x_curr_ofs);
//battery stamp
batValue = sf_cardv_battery_level_get();
if(batValue < SF_BATT_LEVEL_1)
{
batValue = 1;
}
else
{
batValue -= 1;
}
MovieStamp_AttachICON(
combined_stamp_h,
combined_stamp_pos_y,
&Img,
LV_PLUGIN_IMG_ID_ICON_10230_BATTERT + batValue,
false,
padding,
&x_curr_ofs);
/*printf("[%s:%d]moon id=%d,battery id=%d\n", __FUNCTION__, __LINE__,
(LV_PLUGIN_IMG_ID_ICON_10200_MOON + moonday), (LV_PLUGIN_IMG_ID_ICON_10230_BATTERT + batValue));*/
//ratio stamp
//sf_get_movie_resolution_ratio_str(customString);
//printf("[%s:%d]customString=%s\n", __FUNCTION__, __LINE__, customString);
//MovieStamp_AttachString(combined_stamp_h, &Img, customString, font, false, padding, &x_curr_ofs);
//gps stamp
//sprintf((char *)puiPara->Latitude, "3458.3100N");
//sprintf((char *)puiPara->Longitude, "12294.4200E");
// sf_get_gps_info_str((UINT8*)customString, 1);
// if((puiPara->GpsSwitch == SF_ON) && (customString[0] != '\0'))
// {
// //snprintf((char *)customString, sizeof(customString), "N22%c%c34'57\" E113%c%c55'19\"", 0xC2, 0xB0, 0xC2, 0xB0);
// //printf("[%s:%d]customString=%s\n", __FUNCTION__, __LINE__, customString);
// MovieStamp_AttachString(combined_stamp_h, &Img, customString, font, false, padding, &x_curr_ofs);
// MovieStamp_AttachICON(
// combined_stamp_h,
// combined_stamp_pos_y,
// &Img,
// LV_PLUGIN_IMG_ID_ICON_10235_GPS,
// false,
// padding,
// &x_curr_ofs);
// }
hd_common_mem_flush_cache((void *)combined_stamp_addr[vid_in].pool_va, size); hd_common_mem_flush_cache((void *)combined_stamp_addr[vid_in].pool_va, size);
} }
@ -1216,7 +1567,7 @@ void MovieStamp_UpdateData(void)
//DBG_DUMP("i=%d, w=%d, %d, %d\r\n", i,g_VsOsdWidth[i], g_VsOsdHight[i],g_VsFontOut[i].GenImg.loff[0]); //DBG_DUMP("i=%d, w=%d, %d, %d\r\n", i,g_VsOsdWidth[i], g_VsOsdHight[i],g_VsFontOut[i].GenImg.loff[0]);
//MovieStamp_VsUpdateOsd(i, TRUE, 1, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i]); //MovieStamp_VsUpdateOsd(i, TRUE, 1, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i]);
MovieStamp_CombineStamp(i, 0x0); MovieStamp_CombineStamp(i, LV_USER_CFG_MOVIE_STAMP_COLOR_BACKGROUND);
// update 1st stamp // update 1st stamp
// if(MovieStamp_VsUpdateOsd(g_VEncHDPathId[i], TRUE, MOVIE_STAMP_LAYER1, VS_DATESTAMP_REGION, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i])){ // if(MovieStamp_VsUpdateOsd(g_VEncHDPathId[i], TRUE, MOVIE_STAMP_LAYER1, VS_DATESTAMP_REGION, g_MovieStampPos[i].uiX, g_MovieStampPos[i].uiY, g_VsOsdWidth[i], g_VsOsdHight[i], (void*)g_pVsFontDataAddr[i])){

View File

@ -481,7 +481,7 @@ ER lv_user_font_conv_cfg_to_hd_frame(
switch(cfg->fmt) switch(cfg->fmt)
{ {
case HD_VIDEO_PXLFMT_ARGB4444: case HD_VIDEO_PXLFMT_ARGB4444:
loff[0] = (width * height * HD_VIDEO_PXLFMT_BPP(cfg->fmt)) / 8; loff[0] = width * 2;
loff[1] = 0; loff[1] = 0;
break; break;
@ -609,7 +609,7 @@ ER lv_user_font_conv(
} }
if(mem_cfg->output_buffer_size < result.output_buffer_size){ if(mem_cfg->output_buffer_size < result.output_buffer_size){
DBG_ERR("output buffer size(%lx) not enough!\r\n"); DBG_ERR("output buffer size(%lx) not enough(%lx needed)!\r\n", mem_cfg->output_buffer_size, result.output_buffer_size);
return -1; return -1;
} }
@ -656,6 +656,7 @@ ER lv_user_font_conv(
lv_obj_t* canvas = lv_canvas_create(NULL, NULL); lv_obj_t* canvas = lv_canvas_create(NULL, NULL);
/* if img_dsc.header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED , canvas will output alpha channel = 0 for pixel which color is LV_COLOR_TRANSP */ /* if img_dsc.header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED , canvas will output alpha channel = 0 for pixel which color is LV_COLOR_TRANSP */
lv_img_cache_invalidate_src(NULL);
lv_canvas_set_buffer(canvas, working_buffer, result.width, result.height, LV_IMG_CF_TRUE_COLOR_ALPHA); lv_canvas_set_buffer(canvas, working_buffer, result.width, result.height, LV_IMG_CF_TRUE_COLOR_ALPHA);
draw_img_dsc = _lv_user_font_conv_get_draw_img_dsc(draw_cfg); draw_img_dsc = _lv_user_font_conv_get_draw_img_dsc(draw_cfg);