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()之后使用的默认字体。

STM32——EMWIN 字体(二十)相关推荐

  1. STM32学习心得二十六:DAC数模转换实验

    记录一下,方便以后翻阅~ 主要内容: 1) DAC数模转换原理: 2) 寄存器和库函数介绍: 3) 相关实验代码解读. 实验功能:系统启动后,按WK_UP键,输出电压加200点,对应电压值200*3. ...

  2. STM32学习心得二十四:内部温度传感器原理及实验

    记录一下,方便以后翻阅~ 主要内容: 1) STM32内部温度传感器概述: 2) 相关实验代码解读. 实验功能:系统启动后,实时将内部温度传感器的值传至串口助手上. 官方资料:<STM32中文参 ...

  3. STM32——EMWIN对话框(十二)

    EMWIN 文章目录 EMWIN 前言 一.对话框基本原理 二.创建对话框 1.对话框资源表 2.对话框回调函数 3.对话框初始化 三.定义小工具功能 四.对话框API函数 1. GUI_Create ...

  4. STM32入门(二十)----DAC

    DAC 理论 数模转换DAC原理 STM32的DAC的特点 框图 常用寄存器 常用库函数 实践 PWMDAC 理论 数模转换DAC原理 STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电 ...

  5. STM32入门(二十五)----高级定时器

    高级定时器 定时器 高级定时器 高级定时器GPIO 高级定时器功能框图 时钟源 内部时钟源 外部时钟1 外部时钟2 内部触发输入 内部触发连接 TIM1为TIM2提供时钟 控制器 时基单元 预分频器 ...

  6. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  7. 二十款漂亮CSS字体样式

    平时对于网站整站的字体风格常常很纠结,纠结到底用什么样式才行,才好看,后来在网上搜集收到二十种我认为很漂亮的字体样式并使用,感觉很美观,解决了我以前的纠结.具体二十种漂亮样式如下:    样式一: b ...

  8. JavaFx之使用指定字体样式(二十九)

    JavaFx之使用指定字体样式(二十九) javafx use specified font 29 javafx默认的字体样式太丑,可能需要我们自定义字体样式. 之前说好放弃学习javafx,没想到越 ...

  9. MFC Windows 程序设计[二十八]之字体样式(附源码)

    MFC Windows 程序设计[二十八]之字体样式 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C ...

  10. 二十款漂亮的CSS字体样式,让你受用非浅

    二十款漂亮的CSS字体样式,让你受用非浅 平时对于网站整站的字体风格常常很纠结,纠结到底用什么样式才行,才好看,后来在网上搜集收到二十种我认为很漂亮的字体样式并使用,感觉很美观,解决了我以前的纠结.具 ...

最新文章

  1. 图像均值迁移模糊:pyrMeanShiftFiltering()
  2. python下使用qrcode方法
  3. Mybatis使用接口开发
  4. centos 下postgres源码安装
  5. 机房空调制冷、加热、加湿、除湿这些功能如何应用?
  6. 高一计算机专业用平板电脑,高中生需不需要平板电脑或者笔记本电脑?
  7. leetcode24. 两两交换链表中的节点
  8. LOJ10157——皇宫看守(树形DP)
  9. 【转】Xcelsius2008 水晶易表问题 部分汇总
  10. 专门跑顺风车真的挣钱吗?
  11. PHP 微信网页授权开发
  12. python pip 下载
  13. chrome open axure 自动跳转到axure插件
  14. 企业IT基础架构设计概要
  15. python批量修改文件夹名
  16. friends105. The One with the East German Laundry Detergent
  17. sleuth zipkin reporter-sender 分析
  18. 低功耗MCU的选择方法
  19. 大数据学习根据应用目标,主要可以划分为哪三个阶段?
  20. 量子纠缠的超距作用,超光速是假象

热门文章

  1. 【论文翻译】Deep Learning
  2. 惠普计算机如何用u盘引导启动不了系统安装系统,惠普笔记本进BIOS设置U盘启动教程...
  3. 华硕笔记本进bios按哪个键 华硕手提电脑怎么进bios设置
  4. 重装服务器系统步骤,服务器系统重装步骤
  5. android 7 zip压缩文件,7-zip怎么把大文件压缩到最小
  6. linux去掉锁屏密码,安卓手机锁屏密码清除方法 android7.0锁屏密码怎么去除
  7. @POST和GET的区别?
  8. SMD和SMT的区别
  9. 雷军,扎克伯格,乔布斯等巨佬的办公桌
  10. icp matlab,ICP算法MATLAB仿真