硬汉嵌入式论坛

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

[emWin] 分享个裸机解析并显示emwin字体代码

  [复制链接]

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
发表于 2019-2-19 15:51:19 | 显示全部楼层 |阅读模式
1.LCD_SetPoint,LCD_Fill_Rect;画点,填充颜色函数需用户自己实现。

2.不支持抗锯齿字体。

3.只支持GBK编码字体,支持不等宽。

QQ截图20190219154855.png

裸机解析并显示emwin字体.rar (3.11 KB, 下载次数: 110)


评分

参与人数 1金币 +20 收起 理由
byccc + 20 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2019-2-19 17:45:40 | 显示全部楼层
非常感谢楼主分享,置酷
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2019-2-20 08:42:47 | 显示全部楼层
eric2013 发表于 2019-2-19 17:45
非常感谢楼主分享,置酷

不上GUI需要显示文字,用这个挺方便的,看群友有需要,也发个粘水一下。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-2-20 09:36:48 | 显示全部楼层
支持楼主,这样裸机使用FONTCVT软件也很方便了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
发表于 2019-2-20 12:58:14 | 显示全部楼层
感谢分享, 正好有这方面的想法
回复

使用道具 举报

5

主题

21

回帖

36

积分

新手上路

积分
36
发表于 2019-2-20 14:40:27 | 显示全部楼层
楼主,在你这个实现抗锯齿化难不难
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2019-2-20 14:53:19 | 显示全部楼层
建伟 发表于 2019-2-20 14:40
楼主,在你这个实现抗锯齿化难不难

不难,在读取数据时每个点根据bpp来读取数据,画点的颜色用前景色和背景色根据bpp混合就行
回复

使用道具 举报

5

主题

21

回帖

36

积分

新手上路

积分
36
发表于 2019-2-20 14:57:38 | 显示全部楼层
allyzc 发表于 2019-2-20 14:53
不难,在读取数据时每个点根据bpp来读取数据,画点的颜色用前景色和背景色根据bpp混合就行

这一块都是结构体,没太看懂,你能把ucgui的抗锯齿化显示字符相关的代码贴出来吗
回复

使用道具 举报

5

主题

21

回帖

36

积分

新手上路

积分
36
发表于 2019-3-6 15:02:39 | 显示全部楼层
eric2013 发表于 2019-2-19 17:45
非常感谢楼主分享,置酷

请教eric2013  这个函数要支持unicode格式的字符,需要修改上面函数的哪里
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2019-3-6 15:12:35 | 显示全部楼层
建伟 发表于 2019-3-6 15:02
请教eric2013  这个函数要支持unicode格式的字符,需要修改上面函数的哪里

这个是楼主做的,你要请教下楼主。

回复

使用道具 举报

5

主题

21

回帖

36

积分

新手上路

积分
36
发表于 2019-3-6 15:16:51 | 显示全部楼层
eric2013 发表于 2019-3-6 15:12
这个是楼主做的,你要请教下楼主。

请教了,没搞明白,是否用你一个帖子上,FontCvt造字,生成GBK格式的字就行了
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2019-3-7 11:48:01 | 显示全部楼层

增加个utf-8编码支持
  1. //返回解码utf8的字节数
  2. uint32_t getByteNumOfDecodeUtf8(uint8_t byte){
  3.         //byte应该是utf8的最高1字节,如果指向了utf8编码后面低字节部分则返回0
  4.         if((byte & 0xc0)==0x80) return 0;  //1000 0000
  5.         if((byte & 0xf8)==0xf0) return 4;  //1111 0000
  6.         if((byte & 0xf0)==0xf0) return 3;  //1110 0000
  7.         if((byte & 0xe0)==0xc0) return 2;  //1100 0000
  8.         return 1;          //ASCII码
  9. }
  10. //解码以bytePtr为起始地址的utf8序列,其最大长度为length,若不是utf8序列就返回-1
  11. int decodeUtf8(const uint8_t* bytePtr, uint32_t length){
  12.         //若是1字节的ascii码: 0xxxxxxx
  13.         if(*bytePtr <= 0x7f) return *bytePtr;
  14.        
  15.         int value;
  16.         uint32_t remainingBytes;

  17.         //先读取高1字节
  18.         //根据高1字节的高n位判断相应字节数的utf8编码
  19.         if((*bytePtr & 0xe0)==0xc0){
  20.                 //若是2字节的utf8
  21.                 value = *bytePtr & 0x1f; //记录后面的5位有效位
  22.                 remainingBytes = 1;
  23.         }       
  24.         else if((*bytePtr & 0xf0)==0xe0){
  25.                 //若是3字节的utf8
  26.                 value = *bytePtr & 0x0f; //记录后面的4位有效位
  27.                 remainingBytes = 2;
  28.         }
  29.         else if((*bytePtr & 0xf8)==0xf0){
  30.                 //若是4字节的utf8
  31.                 value = *bytePtr & 0x07;
  32.                 remainingBytes = 3;
  33.         }
  34.         else {return -1;} //非法编码
  35.        
  36.         //如果utf8被斩断了就不再读下去了
  37.         if(remainingBytes > length - 1){return -1;}

  38.         //再读取低字节中的数据
  39.         while(remainingBytes > 0){
  40.                 bytePtr++;
  41.                 remainingBytes--;
  42.                 //高两位必须是10
  43.                 if((*bytePtr & 0xc0) != 0x80){return -1;}
  44.                 //从次高字节往低字节读
  45.                 value = value << 6 | (*bytePtr & 0x3f); //value左移6为写入6位有效位
  46.         }
  47.         return value;   //返回解码得到的value值
  48. }
  49. //显示字符串,支持中英文显示
  50. void gui_disp_string(uint16_t x, uint16_t y, const uint8_t *str)
  51. {
  52.     while(*str)
  53.     {   
  54.         //GBK格式
  55.         // if(*str < 0xA0)
  56.         // {
  57.             // gui_disp_char(&x, &y, *str++);
  58.         // }
  59.         // else
  60.         // {
  61.             // uint16_t ch = (uint16_t)*str++ << 8;
  62.             // gui_disp_char(&x, &y, (ch | (uint16_t)*str++));
  63.         // }
  64.         //UTF-8格式
  65.         int data = decodeUtf8(str, strlen(str));
  66.         if(data==-1){
  67.             return;
  68.         }
  69.         else{
  70.             gui_disp_char(&x, &y, data);
  71.             int pos = getByteNumOfDecodeUtf8(*str);
  72.             if(pos==0){
  73.                 return;
  74.             }
  75.             str += pos;
  76.         }
  77.     }
  78. }
复制代码


回复

使用道具 举报

610

主题

3060

回帖

4910

积分

至尊会员

积分
4910
发表于 2019-4-25 14:07:29 | 显示全部楼层
allyzc 发表于 2019-3-7 11:48
增加个utf-8编码支持

虽然没有怎么看懂,但有空还是得研究一下
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2019-4-28 09:47:50 | 显示全部楼层
hpdell 发表于 2019-4-25 14:07
虽然没有怎么看懂,但有空还是得研究一下

就一个UTF8解析,网上的代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 22:05 , Processed in 0.208624 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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