EMWIN
文章目录
- EMWIN
- 一、字体简介
- 二、 字体类型
- 三、 字体格式
-
- 1. C 文件格式
- 2.系统独立字体(SIF)格式
- 3.外部位图字体(XBF)格式
- 4.TrueType 字体(TTF)格式
- 三、声明自定义字体
- 四、 选择字体
- 五、字体常用 API 函数
一、字体简介
字体支持的第一种方法就是使用字体定义中含每个字符的 1 bpp 像素信息位图的 C 文件。这种字体支持仅限于使用应用编译的字体。随着时间推移,字体支持在字体质量、ROM 要求、性能、可扩展性和运行时添加更多字体的能力方面进行了改进。同时,emWin 字体包含抗锯齿、复合字符的图样(例如泰语中的要求)、位于外部非可寻址介质中的字体以及 TrueType 支持。除 TrueType 字体 (矢量字体)格式外,所有其他字体均为位图字体。
二、 字体类型
emWin 支持自行定义的内部类型不同的字体以及常用的 TrueType 字体
等宽位图字体
等宽位图字体的每个字符大小相同。在比例字体中,每个字符有自己的宽度,而等宽字体的宽度只需定义一次。像素信息保存为 1 bpp,涵盖整个字符区域。
比例位图字体
比例位图字体的每个字符高度相同、宽度可能不同。像素信息保存为 1 bpp,涵盖整个字符区域。
抗锯齿字体,包含 2 bpp 抗锯齿信息
每个字符高度相同、宽度可能不同。像素信息保存为 2 bpp 抗锯齿信息,涵盖整个字符区域。
抗锯齿字体,包含 4 bpp 抗锯齿信息
每个字符高度相同、宽度可能不同。像素信息保存为 4 bpp 抗锯齿信息,涵盖整个字符区域。
扩展比例位图字体
扩展比例位图字体的每个字符拥有自己的高度和宽度。像素信息保存为 1 bpp,仅涵盖字形位图区域。
扩展比例位图字体,包含 2 bpp 抗锯齿信息
每个字符高度相同、宽度可能不同。像素信息保存为 2 bpp 抗锯齿信息,仅涵盖字形位图区域。
扩展比例位图字体,包含 4 bpp 抗锯齿信息
每个字符高度相同、宽度可能不同。像素信息保存为 4 bpp 抗锯齿信息,仅涵盖字形位图区域。
扩展比例位图字体,带边框
在某些情况下 (例如编译时背景颜色未知),可以使用带边框的字体。带边框的字体始终在透明模式下绘制,与当前设置无关。字符像素按当前所选的前景颜色绘制,边框按背景颜色绘制。前景颜色和背景颜色之间明显的对比可以确保能够阅读文本,而与背景无关。请注意,这种类型的字体不适用于复合字符,例如泰语,另外,也不适用于 Arabic 字体。
TrueType 矢量字体
emWin 对于矢量字体是支持的,后面章节中会讲解到矢量字体的使用,图 19.2.1 列出了各字体之间的差异。
三、 字体格式
1. C 文件格式
这是最常见的字体使用方式。使用 C 文件格式的字体时,建议作为库模块来编译所有可用的字体和链接它们,或将所有字体对象文件置于可以链接到应用的库中。这样,可确保实际只链接了您的应用所需的字体。
何时使用
在编译时字体已知以及对于字体数据拥有足够的可寻址内存的情况下,可以使用这种格式。
要求
为了能够在应用中使用字体 C 文件,必须满足以下要求:
1、字体文件为与 emWin 兼容的 C 文件、对象文件或库格式。
2、字体文件与您的应用链接。
3、应用中包含字体声明。
格式说明
字体 C 文件首先包含字体所含全部字符的像素信息,之后,是有关每个字符大小信息的字符信息表。此表之后是字体文件中所含各个字符相邻区域的范围信息结构,而每个结构均指向下一个结构。请注意,如果使用许多单独的字符,这种方法可以大幅扩展字体文件。在范围信息结构之后,是 GUI_FONT 结构,其中包含字体的类型、像素大小等主要信息。
2.系统独立字体(SIF)格式
系统独立字体是包含字体信息的二进制数据块,可以使用字体转换器来创建系统独立字体。
何时使用
在编译时字体未知以及对于字体数据拥有足够的可寻址内存的情况下,可以使用这种格式。
要求
为了能够在应用中使用 SIF 字体文件,需要在可寻址存储器 (ROM 或 RAM)中保存整个文件。
格式说明
SIF 文件的结构与 C 文件大致相同,它在二进制格式中包含相同的信息。文件要素的顺序反之亦然:常规字体信息,之后是范围信息结构、字符信息表和所有字符的最小像素信息。
3.外部位图字体(XBF)格式
同 SIF 字体一样,XBF 字体也是包含字体信息的二进制数据块,并且可以使用字体转换器来创建 XBF 文件。与其他字体不同的是,XBF 字体在使用时不必位于存储器中,而 emWin 的所有其他字体均需要完全驻存在存储器中。XBF 字体文件在使用时可保存在任意外部介质中,通过 “GetData”回调函数可以进行数据访问,而所有其他字体都需要驻存在可寻址存储器( RAM 或 ROM)中。XBF 字体的优势在于,可以在内存很小的系统上使用非常大的字体。
何时使用
如果对于字体数据没有足够的可寻址内存,并且可以使用任何其他种类的外部介质来存储字体的情况下,可以使用这种格式。
要求
为了能够在应用中使用 XBF 字体,需要使用 “GetData”回调函数来负责获取字体数据。
格式说明
这种格式总体上与 SIF 和 C 文件格式有所不同。首先,它包含小块常规字体信息,其中包含最低和最高的字符代码。之后,是包含最低和最高字符代码之间每个字符的偏移和数据大小信息的访问表。如果不存在字符,则相应字符的此信息为零。访问表之后是所有字符的字符信息,包含像素数据和字符大小信息。
4.TrueType 字体(TTF)格式
TrueType 是 Apple Computer 开发的轮廓字体标准。它为字体开发人员提供对在各种字体高度下字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同, TrueType 字体基于矢量图形。矢量表示的优势在于无损的可扩展性。这意味着,每个字符在绘制前需要光栅化为位图。为避免每次绘制字符时都进行光栅化,通常用字体引擎缓存位图数据。这要求 CPU 速度快、 RAM 足够。默认的 emWin 源码中不包含 TTF 包。该项内容可在 www.segger.com/link/emwin_freetype.zip 下免费获得。
许可
emWin 对 TTF 支持的实施基于来自 David Turner、 Robert Wilhelm 和 Werner Lembergr的 FreeType 字体库,该库可在 www.freetype.org 下免费获得。emWin 对该库的使用符合GUI\TrueType\FTL.txt 下的 FreeType 许可。 emWin 对该库进行了少许改编,添加了带有 GUI 函数的 “粘贴”层。
何时使用
如果在运行时需要对字体进行缩放,可使用这种格式。
要求
1、CPU: TTF 支持仅适用于 32 位 CPU,emWin 对 32 位 CPU 的定义为:sizeof(int) = 4。
2、ROM: TTF 引擎的 ROM 要求大约为 250 K,确切大小取决于 CPU、编译器以及编译器的优化水平。
3、RAM:该库的 RAM 要求主要取决于使用的字体,TTF 引擎的基本 RAM 要求大约为 50 K。在使用 GUI_TTF_CreateFont() 创建 GUI 字体时,字体引擎会加载生成字符所需的TTF 文件中定义的所有字体表,不同字体之间的表大小有所差异。创建字体额外要求的 RAM 量可能介于几个 KB 到 1 MB 以上之间,一般字体需要 80-300 kb。取决于使用的字体文件需要多少 RAM,至少,TTF 引擎需要位图缓存。默认情况下,引擎使用 200 K 的缓存就足够大多数应用使用。TTF 引擎通过非 emWin 函数 malloc() 和 free() 分配内存。使用 TTF 引擎之前,必须确保能够运行这些函数。
三、声明自定义字体
声明自定义字体原型最推荐的方法是将它们置于应用定义的头文件中。使用这些字体的每个应用源文件中均应包含此内容。如以下示例所示:
#include "GUI.
extern GUI_CONST_STORAGE GUI_FONT GUI_FontApp1;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontApp2;
请注意,如果这些字体要用于 BUTTON_FONT_DEFAULT 或类似的 emWin 配置宏,这种声明原型不起作用。在这种情况下,字体需要在配置文件 GUIConf.h 中声明。这种情况下的声明如以下示例所示:
typedef struct GUI_FONT GUI_FONT;
extern const GUI_FONT GUI_FontApp1;
#define BUTTON_FONT_DEFAULT &GUI_FontApp1
#define EDIT_FONT_DEFAULT &GUI_FontApp1
由于前面 emWin 包含 GUIConf.h 的位置未定义 GUI_FONT 结构,所以需要类型定义符(typedef)。
四、 选择字体
emWin 提供不同的字体,但是始终选择其中之一。通过调用函数 GUI_SetFont() 或GUI_XXX_CreateFont()函数之一可更改此选项,它们将选择用于当前任务所有文本输出的字体。如果应用总没有选择任何字体,则将使用默认字体,默认字体在 GUIConf.h 中配置,且可以更改。因此应该确保默认字体是在应用中实际使用的字体。
五、字体常用 API 函数
GUI_SetDefaultFont() 设置默认字体。
GUI_SetFont() 设置当前字体。
GUI_GetCharDistX() 返回当前字体中指定字符的宽度像素(X 大小)。
GUI_GetFont() 返回当前选择的字体的指针。
GUI_GetFontDistY() 返回当前字体的 Y 间距。
GUI_GetFontInfo() 返回包含字体信息的结构。
GUI_GetFontSizeY() 返回当前字体的高度像素(Y 大小)
GUI_GetLeadingBlankCols() 返回给定字符的前导空格像素列数。
GUI_GetStringDistX() 返回使用当前字体的文本的 X 大小
GUI_GetTextExtend() 评估使用当前字体的文本的大小。
GUI_GetTrailingBlankCols() 返回给定字符的后导空格像素列数。
GUI_GetYDistOfFont() 返回特定字体的 Y 间距。
GUI_GetYSizeOfFont() 返回特定字体的 Y 大小。
GUI_IsInFont() 评估特定字体中是否存在指定的字符。
GUI_SetDefaultFont() 设置 GUI_Init()之后使用的默认字体。