发 帖  
原厂入驻New
[文章]

【emWin实战教程V2.0】第28章 矢量字体(支持汉字全字库,Unicode编码)

2017-2-7 09:11:49  8698
分享
0
转最新版本教程
本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体也有缺点,即非常消耗内存。但是本教程配套开发板STM32F429是支持外接SDRAM,这样就有大容量的空间供矢量字体使用了。
28.1 初学者重要提示
28.2 矢量字体介绍
28.3 STemWin对矢量字体的支持
28.4 矢量字体库的移植方法
28.5 矢量字体库的使用方法
28.6 实验例程说明(RTOS)
28.7 实验例程说明(裸机)
28.8 总结
尹星 2017-2-7 09:12:03
28.1  初学者重要提示

1、使用STM32F429+大容量的SDRAM来实现矢量字体具有一定的实战意义,可用于实际项目。
2、实验中发现了以下三个问题,给大家分享下:
    (1)、不是所有电脑端的矢量字体都可以显示,测试发现有些无法正常显示,估计是emWin库不支持。
    (2)、不能显示太大的字体,测试发现130点阵之后就无法显示了,不知道是不是动态内存和系统堆空间分配小了,以后换了超大容量SDRAM再测试。
    (3)、显示比较大的字体,STM32F429的图形性能完全跟的上,但CPU的计算性能有些吃紧,表现在800*480界面显示满屏字符的时候,整体拖动窗口反应不够流畅。
3、矢量字体也是用的Unicode编码,这点要特别注意。
回复

举报

尹星 2017-2-7 09:12:16
4、矢量字体所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数的位置

回复

举报

尹星 2017-2-7 09:12:29
下图是英文版手册里面API函数的位置:

回复

举报

尹星 2017-2-7 09:12:54
28.2矢量字体介绍

    下面的内容来中文版wiki百科,讲的非常好,特此转载过来:https://zh.wikipedia.org/wiki/%E7%9F%A2%E9%87%8F%E5%AD%97%E4%BD%93 。

    目前主流的矢量字体格式有3种:Type1,TrueType和OpenType,这三种格式都是与平台无关的。
        Type1全称PostScript Type1,是1985年由Adobe公司提出的一套矢量字体标准,由于这个标准是基于PostScriptDescription Language(PDL),而PDL又是高端打印机首选的打印描述语言,所以Type1迅速流行起来。但是Type1是非开放字体,Adobe对使用Type1的公司征收高额的使用费。
    TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。
   
     Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。所以Type1的字体比TrueType字体更加精确美观。一个误解是,Type1字体比TrueType字体占用空间多。这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。然而实际情况是一般来说 Type1比TrueType要小10%左右。这是因为对于稍微复杂的字形,为了保持平滑,TrueType必须使用更多的关键点。由于现代大部分打印机都是使用PDL作为打印描述语言,所以Type1字体打印的时候不会产生形变,速度快;而TrueType则需要翻译成PDL,由于曲线方程的变化,还会产生一定的形变,不如Type1美观。
    这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。很多ps文档和ps转换的pdf文档都是这样,在计算机上浏览的时候字体很难看,但是打印出来很美观。TrueType则渲染比较快,可以平滑的显示在屏幕上,看上去很美观。
    第二个原因是Type1的高额使用费,使得Type1没有被所有的操作系统所支持。Windows家族只有OS/2和windows2000及之后的版本从操作系统级别开始支持Type1。由于这个问题,Adobe只好在其所有的产品中嵌入Adobe Type Manager(ATM)作为渲染引擎。
回复

举报

尹星 2017-2-7 09:13:09
OpenType则是Type1与TrueType之争的最终产物。1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌入Type1和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。可以说OpenType是一个三赢的结局,无论是Adobe、Microsoft还是最终用户,都从OpenType中得到了好处。Windows家族从Windows 2000开始,正式支持OpenType。打开系统的字体目录(一般是C:\Windows\Fonts\或C:\Winnt\Fonts),可以看到:一个红色A的图标的是点阵字体,两个重叠的T的图标是TrueType字体,一个O的图标就是OpenType字体。
    下面是XP系统中字体的部分截图,其中矢量字体扩展名ttf,点阵字体的扩展名是fon。

回复

举报

尹星 2017-2-7 09:15:37
OpenType则是Type1与TrueType之争的最终产物。1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌入Type1和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。可以说OpenType是一个三赢的结局,无论是Adobe、Microsoft还是最终用户,都从OpenType中得到了好处。Windows家族从Windows 2000开始,正式支持OpenType。打开系统的字体目录(一般是C:\Windows\Fonts\或C:\Winnt\Fonts),可以看到:一个红色A的图标的是点阵字体,两个重叠的T的图标是TrueType字体,一个O的图标就是OpenType字体。
    下面是XP系统中字体的部分截图,其中矢量字体扩展名ttf,点阵字体的扩展名是fon。

回复

举报

尹星 2017-2-7 09:15:51
Win7系统中已经变成如下这种样子:

回复

举报

尹星 2017-2-7 10:09:42
28.3 STemWin对矢量字体的支持

    emWin对矢量字体库的支持是基于David Turner、Robert Wilhelm和Werner Lembergr的FreeType字体库,该库可在www.freetype.org下免费获得。emWin对该库的使用符GUI\TrueType\FTL. txt下的FreeType授权许可。emWin对该库进行了少许改编,添加了带有GUI函数的应用层。emWin软件包中也是没有矢量字体库的,需要大家在SEGEER官网地址www.segger.com/link/emwin_freetype.zip下载。

    矢量字体基于矢量图形,矢量的优势在于可以无损的放缩。而点阵字体虽然也可以放缩,但不是矢量的,放缩后锯齿很明显。并且项目中需要多种字体大小支持的话,需要几种字体支持,就需要生成几种点阵字库,非常占空间,而矢量字体仅需要一个字体库就可以了。特别是显示大字体,矢量字体库的优势更明显。
    通过矢量字体带来无损放缩的同时,也是有缺点的。使用矢量字体的话,每个字符在绘制前需要光栅化为位图,为避免每次绘制字符时都进行光栅化,通常用字体引擎缓存点阵数据。这要求CPU速度快、RAM足够。当前emWin对矢量字体的支持是以总线方式寻址的,与第24章讲解的SIF格式字体是类似的。现在使用STM32F103和STM32F407配合外部SRAM来显示字符还可以,但是显示十几MB的矢量汉字就无法实现了,因为当前使用的静态SRAM最大也就2MB,完全放不下一个矢量汉字库,即使放到容量比较大且可以总线方式寻址的NOR Flash里面,并将2MB的SRAM空间分配给系统堆和emWin动态内存,也无法成功。但使用STM32F429配合外部大容量的SDRAM是可以的,效果也不错。本章节配套的例子就是采用这种方式。
回复

举报

尹星 2017-2-7 10:13:26
TrueType矢量字体的硬件要求如下:

回复

举报

尹星 2017-2-7 10:13:40
28.4  矢量字体库的移植方法


    跟第19章讲解的PNG库一样,emWin的库中也是不含有矢量库的,需要用户自行添加,添加也比较简单,只需用户把源码文件添加到工程里面就可以使用了。
    矢量库的下载地址:www.segger.com/link/emwin_freetype.zip。下载软件包后进行解压,官方压缩了两次,解压两次后的部分文件截图(早期的时候里面包含了多个版本,现在官方将其修改为仅包含一个版本,当前 2016-09-13,里面仅有一个5.36版本的库,以后的emWin版本是否还会做其它修改就不得而知了),当前这个版本的库已经被存到本章节配套例子的Doc文件夹:

    MDK编译和IAR编译在移植上是有所不同的,分别进行说明。



回复

举报

尹星 2017-2-7 10:13:54
28.4.1   MDK版本移植说明


第1步:在 emWin工程-->emWin文件夹-->新建一个TrueType文件夹,将矢量字体库里面的源码文件全部复制到此文件夹里面(其它任意文件夹都是可以的,不限制)。

回复

举报

尹星 2017-2-7 10:14:06
第2步:将矢量库的所有.C格式的源码文件添加到MDK工程里面,下面是部分源码文件的截图。

回复

举报

尹星 2017-2-7 10:14:18
第3步:添加矢量库的头文件路径,添加完毕后别忘了点击OK。

回复

举报

尹星 2017-2-7 10:14:53
第4步:修改系统堆(heap)大小,这一步非常关键。因为矢量库要用到函数malloc和free,而这种函数是从系统堆空间里面申请内存的,鉴于矢量库非常的消耗动态内存,这里将16MB SDRAM的最后1MB空间给系统堆使用,设置如下:



      Heap_Size:表示堆大小设置为1MB。
      _heap_base:表示堆起始地址为0xC0F00000,即16MB SDRAM最后1MB空间的起始地址。
      _heap_linmit:表示堆结束地址0xC0FFFFFF,即16MBSDRAM最后1MB空间的结束地址。
回复

举报

尹星 2017-2-7 10:15:06
除了malloc和free要用到堆空间,部分C标准库的其它函数也要用到堆空间,所以一定要及时初始化SDRAM,防止用到堆空间的时候,SDRAM还没有初始化,将导致系统崩溃。当前是将SDRAM的初始化放在了bsp.c文件的bsp_Init函数开始的地方,之前执行的程序都没有用到C标准库,所以可以放在这里。
    讲解完这些,还有一点知识要补充的,矢量汉字库是非常大的,稍小点的都得10MB,大点的得20MB,教程配套板子的SDRAM只有16MB,有点捉襟见肘,所以要重新划分下,当前是把前3MB的空间给LCD的显存使用,相关代码不用做任何修改,因为默认的800*480分辨率,RGB565格式的三缓冲大小800*480*2*3 大概是2.19MB(乘以2是因为RGB565格式需要2字节来表示一个像素),小于3MB。中间的12MB用于emWin动态内存,最后1MB用于系统堆空间,这里有两个地方要修改一下,一个是bsp_fmc_sdram.h文件,修改emWin动态内存的起始地址
复制代码
/*
**********************************************************************************************************
                                          emWin使用
**********************************************************************************************************
*/
/* emWin动态内存首地址 */
#define SDRAM_APP_BUF  (EXT_SDRAM_ADDR + 3 * 1024 * 1024)
回复

举报

尹星 2017-2-7 10:15:19
另一个是GUIConf.c文件,将emWin的动态内存大小设置为12MB,即下面置红的字体。
复制代码
//
// Define the available number of bytes available for the GUI
//
#define EX_SRAM   1/*1 used extern sram, 0 used internal sram */
#if EX_SRAM
#define GUI_NUMBYTES  (1024*1024*12)
#else
#define GUI_NUMBYTES  (100*1024)
#endif
/* Define the average block size */
#define GUI_BLOCKSIZE 0x80

修改完毕这几个地方后,就没有问题了,使用的时候选取了仿宋体,大小是10MB,系统上电后将其加载到emWin的动态内存里面,也就是SDRAM里面。
回复

举报

尹星 2017-2-7 10:15:31
第5步:最后一步,添加好库文件并且修改完毕后,验证是否已经添加成功,可以进行一次全编译,全编译后MDK会有几个警告,这个是矢量库的问题,但都不影响正常使用。


至此,矢量字体库就添加成功了。剩下就可以调用矢量库的API函数了。

回复

举报

尹星 2017-2-7 10:15:48
28.4.2   IAR版本移植说明


第1步:在 emWin工程-->emWin文件夹-->新建一个TrueType文件夹,将矢量字体库里面的源码文件全部复制到此文件夹里面(其它任意文件夹都是可以的,不限制

回复

举报

尹星 2017-2-7 10:31:25
第1步:在 emWin工程-->emWin文件夹-->新建一个TrueType文件夹,将矢量字体库里面的源码文件全部复制到此文件夹里面(其它任意文件夹都是可以的,不限制

回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
123下一页
发文章
快速回复 返回顶部 返回列表