【STemWin教程入门篇】第22章 TrueType矢量字体

标签:
矢量字体ucos-iiiucguiemwintruetype |
分类: emWin |
第22章
TrueType矢量字体
本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体的缺点就是不适合用在小型嵌入式系统中,极其消耗内存。
22.
22.
22.
22.1
矢量字体介绍
下面的内容来自百度百科和wiki百科(两个内容居然一模一样),讲的非常好,特此转载过来。
目前主流的矢量字体格式有3种:Type1,TrueType和OpenType,这三种格式都是与平台无关的。
Type1全称PostScript
TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。
Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。所以Type1的字体比TrueType字体更加精确美观。一个误解是,Type1字体比TrueType字体占用空间多。这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。然而实际情况是一般来说
这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。很多ps文档和ps转换的pdf文档都是这样,在计算机上浏览的时候字体很难看,但是打印出来很美观。TrueType则渲染比较快,可以平滑的显示在屏幕上,看上去很美观。
第二个原因是Type1的高额使用费,使得Type1没有被所有的操作系统所支持。Windows家族只有OS/2和windows
OpenType则是Type1与TrueType之争的最终产物。1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌入Type1和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。可以说OpenType是一个三赢的结局,无论是Adobe、Microsoft还是最终用户,都从OpenType中得到了好处。Windows家族从Windows
矢量字体扩展名ttf。点阵字体的扩展名是fon.
下面是XP系统中字体的部分截图:
22.2
STemWin对矢量字体的支持
TrueType为字体开发人员提供对在各种字体高度下字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同,TrueType字体基于矢量图形。矢量表示的优势在于无损的可扩展性。这意味着,每个字符在绘制前需要光栅化为位图。为避免每次绘制字符时都进行光栅化,通常用字体引擎缓存位图数据。这要求CPU速度快、RAM足够。发货时不含emWin
emWin对TTF支持的实施基于来自David
TrueType矢量字体的硬件要求如下:
CPU |
TTF支持仅适用于32位CPU。我们对32位CPU的定义为:sizeof(int)= |
ROM |
TTF引擎的ROM要求大约为250 |
RAM |
该库的RAM要求主要取决于使用的字体。TTF引擎的基本RAM要求大约为50 能够运行这些函数。 |
从SEGGER官网下载的矢量库主要有以下文件:
TrueType相关的文件还是很多的,这里只贴了部分源码。
22.3
模拟器上面运行矢量字体
在emWin模拟器中,官方专门做了一个例子用于运行矢量字体,程序DEMO位置如下:
这个DEMO程序的代码如下:
#ifndef
#include
#include
#include
static
static
static
static
static
static
}
static
}
static
}
static
}
void
}
#endif
1.
2.
函数:GUI_TTF_GetStyleName
3.
4.
GUI_TTF_CS
数据类型 |
元素 |
描述 |
GUI_TTF_DATA |
pTTF |
指向包含要使用的字体文件位置和大小的GUI_TTF_DATA结构 |
PixelHeight |
PixelHeight |
新字体的像素高度。表示字形 |
FaceIndex |
FaceIndex |
有些字体文件可能包含多种字体风格。对于多种风格,此索引指定使用基于零的风格索引来创建字体。通常为0。 |
GUI_TTF_DATA
数据类型 |
元素 |
描述 |
const |
pData |
指向可寻址存储器区域中的TTF字体文件。 |
NumBytes |
NumBytes |
文件的大小 |
5.
6.
7.
实际显示效果如下(这里只贴了一个截图)
22.4
移植到开发板上显示
22.4.1 第一步:从官网下载矢量库
下载地址:www.segger.com/link/emwin_freetype.zip
22.4.2 第二步:添加到emWin工程中(MDK)
添加上后需要再添加相应的工程路径:
22.4.3 第三步:修改Heap的大小
由于要使用非emWin自带的molloc和free函数,下面是修改的位置和大小:
这个地方一定得大点,要不字体无法显示。
22.4.4 第四步:主程序
void
{
OS_ERR
char
GUI_TTF_CS
GUI_TTF_DATA
GUI_FONT
GUI_HMEM
GUI_Init();
_acBuffer
OSSchedLock(&err);
result
result
OSSchedUnlock(&err);
Data.pData
Data.NumBytes
Cs0.pTTF
Cs0.PixelHeight
Cs0.FaceIndex
Cs1.pTTF
Cs1.PixelHeight
Cs1.FaceIndex
Cs2.pTTF
Cs2.PixelHeight
Cs2.FaceIndex
Cs3.pTTF
Cs3.PixelHeight
Cs3.FaceIndex
GUI_TTF_CreateFont(&Font0,
GUI_TTF_CreateFont(&Font1,
GUI_TTF_CreateFont(&Font2,
GUI_TTF_CreateFont(&Font3,
GUI_SetFont(&Font0);
GUI_DispStringAt("ABC1234",
GUI_SetFont(&Font1);
GUI_DispStringAt("ABC1234",
GUI_SetFont(&Font2);
GUI_DispStringAt("ABC1234",
GUI_SetFont(&Font3);
GUI_DispStringAt("ABC1234",
GUI_DispStringAt("ARMFLY",
while(1)
{
GUI_Delay(100);
}
}
1.
2.
3.
4.
22.4.5 第五步:矢量字体放到SD卡中
由于汉字的矢量字体比较大,使用2MB的SRAM空间不够,这里使用从网上下载的米字体做为显示。
放到SD卡后,在屏上的实际显示效果如下:
特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示。
22.5
总结
矢量字体就跟大家讲这么多,更多的知识可以研究下源码的实现。关于字体的显示截至到本期教程就算结束了。