硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7561|回复: 10
收起左侧

[LVGL] Littlevgl 添加外部中文字库方法

  [复制链接]

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-20 15:05:39 | 显示全部楼层 |阅读模式
本帖最后由 akatsuki_lim 于 2018-9-20 15:05 编辑

这里介绍一种littlevgl下读取外部中文字库,实现汉字显示的方法。

littlevgl移植方法可百度,这里不多介绍。
////////////////////////////////////////////////////////////////////////////////////
参考官方的实现外语的方法,主要是注册好lv_font_t结构体里面的参数、函数即可。结构体里面主要的内容是字符内码的起始、结束序号,字体高度,字库表,字体描述(字款和字库偏移量),获取字库数据函数,获取字库宽度函数,下一字库指向,抗锯齿bpp。
  1. typedef struct _lv_font_struct
  2. {
  3.     uint32_t unicode_first;
  4.     uint32_t unicode_last;
  5.     uint8_t h_px;
  6.     const uint8_t * glyph_bitmap;
  7.     const lv_font_glyph_dsc_t * glyph_dsc;
  8.     const uint32_t * unicode_list;
  9.     const uint8_t * (*get_bitmap)(const struct _lv_font_struct * ,uint32_t);    /*获取字库数据函数指针*/
  10.     int16_t (*get_width)(const struct _lv_font_struct * ,uint32_t);       /*获取字体宽度函数指针*/
  11.     struct _lv_font_struct * next_page;    /*Pointer to a font extension*/
  12.     uint32_t bpp   :4;                     /*Bit per pixel: 1, 2 or 4*/
  13. }lv_font_t;
复制代码


以工程里面的实现GBK中文16*16大小为例,在lv_font_hz16.c里面填充结构体
  1. lv_font_t lv_font_hz16 =
  2. {   
  3.     .unicode_first = 0x0020,        //0xA1A1  /*First Unicode letter in this font*/
  4.     .unicode_last = 0xFFFF,                /*Last Unicode letter in this font*/
  5.     .h_px = 16,                                        //一个字符的高度  /*Font height in pixels*/
  6.     //.glyph_bitmap = arial_ascii_20_glyph_bitmap, //字库指针,这里使用的是由外部读取的数据,暂时不注册/*Bitmap of glyphs*/
  7.     //.glyph_dsc = arial_ascii_20_glyph_dsc, //字库描述指针,在这里亦用不上/*Description of glyphs*/
  8.     .unicode_list = NULL,                /*Every character in the font from 'unicode_first' to 'unicode_last'*/
  9.     .get_bitmap = lv_font_hz_get_bitmap_continuous,        //获取字符表函数指针,这里不使用vlg的函数方法 /*Function pointer to get glyph's bitmap*/
  10.     .get_width = lv_font_hz_get_width_continuous,        //获取字符宽度函数指针,这里不使用vlg的函数方法  /*Function pointer to get glyph's width*/
复制代码

其中 函数lv_font_hz_get_bitmap_conuinuous和 函数lv_font_hz_get_width_continuous 实现与ui回调处理的接口
  1. <blockquote>
复制代码


字库为GBK编码,取模的方法可参考:
http://www.armbbs.cn/forum.ph ... 6%BF%E2%C9%FA%B3%C9

////////////////////////////////////////////////////////////////////////////////////
实现了获取字库函数之余,ui的lv_txt.c里面的lv_txt_utf8_next函数还得修改为:
  1. uint32_t lv_txt_utf8_next(const char * txt, uint32_t * i)
  2. {
  3. #if LV_TXT_UTF8 == 0
  4.     if(i == NULL) return txt[1];    /*Get the next char */

  5.     uint8_t letter = txt[*i] ;
  6.     (*i)++;
  7.     return letter;
  8. #else
  9.     /* Unicode to UTF-8
  10.      * 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx
  11.      * 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx
  12.      * 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx
  13.      * 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx
  14.      * */

  15.     uint32_t result = 0;

  16.     /*Dummy 'i' pointer is required*/
  17.     uint32_t i_tmp = 0;
  18.     if(i == NULL) i = &i_tmp;

  19.     /*Normal ASCII*/
  20.     if((txt[*i] & 0x80) == 0) {
  21.         result = txt[*i];
  22.         (*i)++;
  23.     }
  24.     /*Real UTF-8 decode*/
  25.     else {
  26.                 //GBK
  27.                 result = (uint32_t)(txt[*i]) ;
  28.                 (*i)++; /*Not UTF-8 char. Go the next.*/
  29.                                 
  30.                 result += (uint32_t)(txt[*i])<< 8;
  31.                 (*i)++;
  32.     }
  33.     return result;
  34. #endif
  35. }
复制代码
原本作者打算拓展的是utf-8编码的字库,但实际上字库生成器生成的是gbk编码,所以返回内码的时候需要另外做处理。
注:因为我这里是直接删除了utf-8 decode部分,所以ui不能使用utf-8的字符!!!(后续再填补这个bug)

//////////////////////////////////////////////////////////////////////////////////
这里就记录主要修改部分,具体的可参考附上的工程代码。

另外,可在github上看看原作者与网友讨论的内容,对增加中文支持应该会有更好的办法。
https://github.com/littlevgl/lvgl/issues/78

图片_20180920150018.jpg

3.LittlevGL FreeRTOS Font V1.1.rar

3.41 MB, 下载次数: 447

Littlevgl 添加外部中文字库工程

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2018-9-20 15:17:45 | 显示全部楼层

回帖奖励 +1 个金币

非常感谢楼主分享
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2018-9-20 15:18:50 | 显示全部楼层
eric2013 发表于 2018-9-20 15:17
非常感谢楼主分享

谢谢硬汉支持
回复

使用道具 举报

0

主题

46

回帖

46

积分

新手上路

积分
46
发表于 2018-9-20 17:29:06 | 显示全部楼层
谢谢   刚考虑着 字体问题就来资源了
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2018-9-22 09:05:35 | 显示全部楼层
666
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
QQ
发表于 2019-6-26 18:46:44 | 显示全部楼层

TIM图片20190626184354.jpg
TIM图片20190626184350.jpg

TIM图片20190626184345.jpg

列表和标签的字是对的,其他的不对,有可能是哪有问题



回复

使用道具 举报

1

主题

43

回帖

46

积分

新手上路

积分
46
发表于 2019-10-11 11:33:11 | 显示全部楼层
嗯,我自己做都是用unicode编码。有点不理解为啥还要用gbk这种编码。如果后面有更多外文的需要不是抓瞎了。。。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-7-4 09:31:13 | 显示全部楼层
你好,我移植你这个显示外部字库的程序后,发现显示的中文汉字,每个汉字都是左右翻转镜像后又旋转90度了。用的是原子哥的字库文件。这个现象是不是在哪里改一下驱动方式?还是一定要重新做字库文件。谢谢。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2020-7-6 09:52:02 | 显示全部楼层
wyfzgybd 发表于 2020-7-4 09:31
你好,我移植你这个显示外部字库的程序后,发现显示的中文汉字,每个汉字都是左右翻转镜像后又旋转90度了。 ...

重新做字库把,帖子这个方法的本质还是访问外部存储的字库
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-7-23 20:52:44 | 显示全部楼层
你好,博主,我现在也在做字库跟换的处理,但是发现你的版本和我现在的版本不一样,而且结构体差异挺大的,所以想请教一下怎么弄,我这个应该是6.0版本的
回复

使用道具 举报

0

主题

35

回帖

35

积分

新手上路

积分
35
发表于 2020-7-26 14:11:33 | 显示全部楼层
下来试试效果,谢谢分享,不知道V6版本能用不
回复

使用道具 举报

0

主题

0

回帖

0

积分

新手上路

积分
0
发表于 2020-10-4 17:59:06
感谢大佬分享

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 15:04 , Processed in 0.402915 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表