39. 矢量字体显示

本文介绍了矢量字体的概念,包括Type1、TrueType和OpenType字体格式。重点讲述了如何在嵌入式系统中移植和使用TrueType字体,特别是通过emWin图形库和FreeType引擎。文章详细描述了移植过程,包括添加FreeType库到工程、修改启动文件以扩大堆内存以及相关API的使用。最后,通过一个使用Android Droid Sans字体的实验展示了TTF字体在不同大小下的平滑显示效果,同时提到了在嵌入式系统中选择合适字体的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等, 字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。 目前较为流行的矢量字体主要包括 Type1 、TrueType、OpenType等几类。

Type 1(也称为PostScript Type 1或Adobe Type 1)是Adobe Systems为专业数字排版开发的轮廓字体规范编码的字体文件, 使用三次贝塞尔曲线来描述字形,1985年刚推出时被用在激光打印机上。

TrueType是苹果公司在20世纪80年代末开发的一种轮廓字体标准,是Type1字体的竞争对手。 这种字体的轮廓采用直线段和二次贝塞尔曲线描述字形。与三次贝塞尔曲线相比,这些曲线在数学上更简单,处理速度也更快, 但是对于复杂形状而言二次曲线比三次曲线需要更多的点来描述。目前已经成为macOS和Microsoft Windows操作系统中最常见的字体格式。

OpenType由微软和Adobe共同开发,在TrueType的基础上发展而来,保留了TrueType的基本结构, 并添加了许多复杂的数据结构来规定排版行为。由于这种字体具有广泛的可用性和排版灵活性, 包括处理世界上所有书写系统的各种行为的规定,所以在主要的计算机平台上通常使用OpenType字体。

39.1. 矢量字体原理简介
之前几个章节所讲的字体都属于点阵字体,这种字体并不是以矢量描述的,放大以后会出现锯齿。而矢量字体由于采用数学语言进行描述, 在放大若干倍后依旧很清晰。图 点阵字体与矢量字体 展示的是把点阵字体和矢量字体放大到相同大小时的效果。
在这里插入图片描述
我们以“火”字为例,给大家简单粗略地介绍一下矢量字体的显示原理。
在这里插入图片描述
一个字可以使用多条线段来表示,对于这些线段,我们只需要保存它的端点值,如图 火字 的白色空心圆所示, 当我们想要显示某个字时,就取出这些关键点,通过贝塞尔曲线将这些点的坐标连接起来,最后进行填充。 放大或缩小字体的时候,只需要按比例缩放改变这些端点值的相对位置就可以了。

在矢量字体文件中,每个字符都是以一系列的点存放的,其中有一些点是控制点, 利用这些控制点来实现绘制抛物线的功能,如图 点绘制线 所示,p1是控制点,c1、c2是曲线的端点, 因此曲线可以用下面的公式进行描述,这描述方式就是贝塞尔曲线。

p(t)= (1−t)2p0 + 2t(1−t)p1 + t2p2 (0 < t < 1 )

在这里插入图片描述
回过头,看图 火 ,方框处是不是和上面说的原理是一样的,空心的点是线段的端点, 实心的点是控制点,利用贝塞尔曲线,描绘出字体的轮廓,最后在进行黑色填充,就完成了。
在这里插入图片描述
39.2. 移植TTF渲染引擎
emWin支持3种主流矢量字体格式中的TrueType格式。和SIF格式一样,使用TTF格式字库的时候需要将字库全部加载到RAM中, 然后使用TTF字体渲染引擎显示字体。emWin可以使用一款叫FreeType的TTF字体渲染引擎,此引擎占用的RAM空间在很大程度上取决于所用的字体, 但最少会占用80~300KB,其中200KB用于字体的光栅化位图缓存。

虽然emWin支持FreeType,但库本身并不包含这款字体渲染引擎,需要用户自行移植。 接下来我们讲解一下如何将TTF字体渲染引擎移植到emWin工程中。

  1. 下载并解压TTF引擎。FreeType字体渲染引擎可以从emWin官网下载到, 链接如下:https://www.segger.com/downloads/emwin/emWin_FreeType。 下载完成后解压emWin_FreeType压缩包,可以看到如图 emwin_freetype内容 所示的结构, 压缩包内包含了对应emWin各个版本的TTF引擎,我们选取适合我们例程的版本即选择V544;
    在这里插入图片描述
  2. 添加TTF引擎到工程。选择好版本之后,将PNG库整个文件夹复制到工程文件夹下,其实随便那个文件夹都行, 只要在工程文件夹内。如所示,我们选择将PNG库放在工程的STemWin文件夹下。 然后在MDK工程内新建分组并把PNG库添加进新分组中,如图 添加引擎到工程文件夹 ;
    在这里插入图片描述
  3. 添加PNG库头文件路径。在工程设置中把TTF引擎的头文件路径添加进去, 见图 添加头文件路径 。
    在这里插入图片描述
  4. 修改启动文件。由于TTF引擎需要用到malloc、free和relloc等C库函数,而这些函数又使用的是系统堆内存空间,所以需要增加堆内存空间大小。 见图 修改堆空间大小 和图 在main函数前初始化SDRAM 。
    在这里插入图片描述
    在这里插入图片描述
    至此,emWin的TTF字体渲染引擎就移植完成了,可能最后工程编译完成后有较多警告,属于正常情况。

39.3. TTF字体显示相关API
在这里插入图片描述
39.3.1. GUI_TTF_CreateFont()
使用TTF字体文件创建和选择emWin字体。

代码清单:矢量字体-1 函数原型

int GUI_TTF_CreateFont(GUI_FONT *pFont, GUI_TTF_CS *pCS);
  1. pFont: 指向RAM中由该函数填充的GUI_FONT结构的指针;

  2. pCS: 指向包含创建参数的GUI_TTF_CS结构的指针,GUI_TTF_CS结构原型见 代码清单:矢量字体-2 。

返回值:字体创建成功时返回0,创建失败返回1。

代码清单:矢量字体-2 GUI_TTF_CS原型

typedef struct {
   
    GUI_TTF_DATA * pTTF;
    U32 aImageTypeBuffer[4];
    int PixelHeight;
    int FaceIndex;
} GUI_TTF_CS;
  1. pTTF: 指向GUI_TTF_DATA结构的指针,该结构包含要使用的字体文件的位置和大小,GUI_TTF_DATA结构原型见 代码清单:矢量字体-3 ;

  2. aImageTypeBuffer: 用于图像类型结构的缓冲区;

  3. PixelHeight: 新字体的像素高度。它表示字体的边界高度,不是两行文本之间的距离。换句话说,GUI_GetFontSizeY(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值