lvgl的区别qt_最新LVGL_V7.0及以上版本添加内、外部中⽂字
体⽅法
#define FONTSECSIZE 2560
#define FONTINFOADDR 1024*1024*6
_font_info ftinfo;
/* 字库存放在磁盘中的路径 */
const char * GBK24_PATH="/SYSTEM/FONT/GBK24.FON"; /* GBK24的存放位置 */
const char * GBK16_PATH="/SYSTEM/FONT/GBK16.FON"; /* GBK16的存放位置 */
const char * GBK12_PATH="/SYSTEM/FONT/GBK12.FON"; /* GBK12的存放位置 */
const char * UNIGBK_PATH="/SYSTEM/FONT/UNIGBK.BIN"; /* UNIGBK.BIN的存放位置 */
const char * LVGL_12_PATH="/SYSTEM/LVGLFONT/myFont12.bin"; /* UNIGBK.BIN的存放位置 1,014,611 字节 */
const char * LVGL_18_PATH="/SYSTEM/LVGLFONT/myFont18.bin"; /* UNIGBK.BIN的存放位置 1,732,774 字节 */
const char * LVGL_24_PATH="/SYSTEM/LVGLFONT/myFont24.bin"; /* UNIGBK.BIN的存放位置 2,814,026 字节 */
/**
* @brief 显⽰当前字体更新进度
* @param x, y : 坐标
* @param size : 字体⼤⼩
* @param totsize : 整个⽂件⼤⼩
* @param pos : 当前⽂件指针位置
* @param color : 字体颜⾊
* @retval ⽆
*/
uint32_t fupd_prog(uint16_t x,uint16_t y,uint8_t size,uint32_t fsize,uint32_t pos)
{
float prog;
uint8_t t=0XFF;
prog=(float)pos/fsize;
prog*=100;
if(t!=prog)
{
msinfolcd_show_string(x+3*size/2,y,240,320,size,"%",g_point_color);
t=prog;
if(t>100)t=100;
lcd_show_num(x,y,t,3,size,g_point_color);/* 显⽰数值 */
}
return 0;
}
/**
* @brief 更新某⼀个字库
* @param x, y : 提⽰信息的显⽰地址
* @param size : 提⽰信息字体⼤⼩
* @param fpath : 字体路径
* @param fx : 更新的内容
* @arg 0, ungbk;
* @Arg 1, gbk12;
* @arg 2, gbk16;
* @arg 3, gbk24;
* @arg 4, gbk32;
* @param color : 字体颜⾊
* @retval 0, 成功; 其他, 错误代码;
*/
uint8_t updata_fontx(uint16_t x,uint16_t y,uint8_t size,char *fxpath,uint8_t fx) {
uint32_t flashaddr=0;
FIL * fftemp;
uint8_t *tempbuf;
uint8_t res;
uint16_t bread;
uint32_t offx=0;
uint8_t rval=0;
fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); /* 分配内存 */ if(fftemp==NULL)rval=1;
tempbuf=mymalloc(SRAMIN,4096); /* 分配4096个字节空间 */
if(tempbuf==NULL)rval=1;
res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ);
if(res)rval=2;/* 打开⽂件失败 */
if(rval==0)
{
switch(fx)
{
case 0: /* 更新UNIGBK.BIN */
ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo); /* 信息头之后,紧跟UNIGBK转换码表 */ ftinfo.ugbksize=fftemp->fsize; /* UNIGBK⼤⼩ */
flashaddr=ftinfo.ugbkaddr;
break;
case 1:
ftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize; /* UNIGBK之后,紧跟GBK12字库 */ ftinfo.gbk12size=fftemp->fsize; /* GBK12字库⼤⼩ */
flashaddr=ftinfo.f12addr; /* GBK12的起始地址 */
break;
case 2:
ftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size; /* GBK12之后,紧跟GBK16字库 */ ftinfo.gbk16size=fftemp->fsize; /* GBK16字库⼤⼩ */
flashaddr=ftinfo.f16addr; /* GBK16的起始地址 */
break;
case 3:
ftinfo.f24addr=ftinfo.f16addr+ftinfo.gbk16size; /* GBK16之后,紧跟GBK24字库 */ ftinfo.gkb24size=fftemp->fsize; /* GBK24字库⼤⼩ */
flashaddr=ftinfo.f24addr; /* GBK24的起始地址 */
break;
case 4:
ftinfo.lvgl_12addr=ftinfo.f24addr+ftinfo.gkb24size;
ftinfo.lvgl_12size=fftemp->fsize;
flashaddr=ftinfo.lvgl_12addr;
break;
case 5:
ftinfo.lvgl_18addr=ftinfo.lvgl_12addr+ftinfo.lvgl_12size;
ftinfo.lvgl_18size=fftemp->fsize;
flashaddr=ftinfo.lvgl_18addr;
break;
case 6:
ftinfo.lvgl_24addr=ftinfo.lvgl_18addr+ftinfo.lvgl_18size;
ftinfo.lvgl_24size=fftemp->fsize;
flashaddr=ftinfo.lvgl_24addr;
break;
}
while(res==FR_OK)/* 循环执⾏ */
{
res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); /* 读取数据 */
if(res!=FR_OK)break; /* 执⾏错误 */
w25qxx_write(tempbuf,offx+flashaddr,4096); /* 从0开始写⼊4096个数据 */ offx+=bread;
fupd_prog(x,y,size,fftemp->fsize,offx); /* 进度显⽰ */
if(bread!=4096)break; /* 读完了 */
}
f_close(fftemp);
}
myfree(SRAMIN,fftemp); /* 释放内存 */
myfree(SRAMIN,tempbuf); /* 释放内存 */
return res;
}
/
**
* @brief 更新字体⽂件
* @note 所有字库⼀起更新(UNIGBK,GBK12,GBK16,GBK24,GBK32)
* @param x, y : 提⽰信息的显⽰地址
* @param size : 提⽰信息字体⼤⼩
* @param src : 字库来源磁盘
* @arg "0:", SD卡;
* @Arg "1:", FLASH盘
* @arg "2:", U盘
* @param color : 字体颜⾊
* @retval 0, 成功; 其他, 错误代码;
*/
uint8_t update_font(uint16_t x,uint16_t y,uint8_t size,char *src) {
char *pname;
uint32_t *buf;
uint8_t res=0;
uint16_t i,j;
FIL *fftemp;
uint8_t rval=0;
res=0XFF;
ftinfo.fontok=0XFF;
pname=mymalloc(SRAMIN,100); /* 申请100字节内存 */
buf=mymalloc(SRAMIN,4096); /* 申请4K字节内存 */
fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); /* 分配内存 */
if(buf==NULL||pname==NULL||fftemp==NULL)
{
myfree(SRAMIN,fftemp);
myfree(SRAMIN,pname);
myfree(SRAMIN,buf);
return 5; /* 内存申请失败 */
}
/* 先查⽂件是否正常 */
strcpy((char*)pname,(char*)src); /* copy src内容到pname */ strcat((char*)pname,(char*)UNIGBK_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<4;/* 打开⽂件失败 */
strcpy((char*)pname,(char*)src); /* copy src内容到pname */ strcat((char*)pname,(char*)GBK12_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<5;/* 打开⽂件失败 */
strcpy((char*)pname,(char*)src); /* copy src内容到pname */ strcat((char*)pname,(char*)GBK16_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<6;/* 打开⽂件失败 */