如何給lvgl(一个小型开源GUI)增加汉字支持?

2019-12-11 18:18发布

如何給lvgl(一个小型开源GUI)增加汉字支持?要求可以汉字和英文字符混合显示。汉字采用一个SPI接口字库,英文字符字库为内置。存在汉字和英文字符宽度不相等,以及取字库位置不同等问题。有经验的朋友帮忙提供点思路,非常感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
billtian
2019-12-12 10:48
本帖最后由 billtian 于 2018-11-14 16:49 编辑

中英文混合显示OK了 简单记录下过程
填充字体结构体
lv_font_t lv_user_font_1616 = {
    .unicode_first = 0,                        /*简单设置成0*/
    .unicode_last = 0xffff,                /*简单设置成65535*/
    .h_px = 16,                           /*字体高度,16*16字体为16*/
    .glyph_bitmap = NULL,                /*如果字库以数组形式放C文件里,此处为数组地址,我是从外部FLASH内读入所以设置为空*/
    .glyph_dsc = NULL,               /*设置为空*/
    .glyph_cnt = 0xffff,                  /*字库内字符个数 设置为65535*/
    .unicode_list = NULL,           /*Every character in the font from 'unicode_first' to 'unicode_last'*/
    .get_bitmap = lv_user_font_get_bitmap,    /*读取字库数据函数*/
    .get_width = lv_user_font_get_width,           /*读取字库宽度函数*/
    .bpp = 1,                                               /*Bit per pixel 一般为1*/
    .monospace = 0,
    .next_page = NULL,      /*Pointer to a font extension*/
};
实现以下两个函数
lv_user_font_get_bitmap,    /*读取字库数据函数*/
lv_user_font_get_width,           /*读取字库宽度函数*/
用以下函数初始化时调用 加入自定义字体
void lv_user_font_init(void)
{
      lv_font_add(&lv_user_font_1616, NULL);
}
修改lv_txt.c中以下文件  增加对中文字符的判断
static uint32_t lv_txt_ascii_next(const char * txt, uint32_t * i)
{
    if(i == NULL) return txt[1];    /*Get the next char */

    if((txt[*i] & 0x80) == 0)
    {
        uint8_t letter = txt[*i] ;
        (*i)++;
        return letter;
    }
    else
    {
        uint32_t letter = txt[*i];
        (*i)++;
                                letter <<= 8;
                                letter += txt[*i];       
        (*i)++;
        return letter;
    }
    return 0;
}
lv_conf.h中增加以下
#define LV_FONT_CUSTOM_DECLARE         LV_FONT_DECLARE(lv_user_font_1616)
现在就可以把默认字体改成自己的字体实验一下了
#define LV_FONT_DEFAULT        &lv_user_font_1616
显示效果如下

IMG_20181114_162851.jpg (580.17 KB, 下载次数: 0)

下载附件

2018-11-14 16:49 上传

一周热门 更多>