linux应用编程--LCD屏幕利用freetye显示字符

freetype介绍:

FreeType 一个完全免费(开源)的软件字体引擎库,设计小巧、高效、高度可定制且可移植,它提供了 统一的接口来访问多种不同格式的字体文件。它提供了一个简单、易于使用且统一的接口来访问字体文件 的内容,从而大大简化了这些任务。 请注意,“FreeType”也称为“FreeType 2”,以区别于旧的、已弃用的“FreeType 1”库,Freetype 1 库已经不再维护和支持了。

freetype移植

下载源码:开发板出厂系统中,FreeType 的版本为 2.6,这个版本稍微有点低,我们选择移植 2.8 版本的 FreeType。 进入到 https://download.savannah.gnu.org/releases/freetype/链接地址,

交叉编译源码:将下载好的 freetype-2.8.tar.gz 压缩文件拷贝到 Ubuntu 系统的用户家目录下,在 tools 目录下创建一个名为 freetype 的目录,把它作为 FreeType 的安装目录:执行命令将 freetype-2.8.tar.gz 解压开来:

tar -xzf freetype-2.8.tar.gz

解压成功之后便会得到 FreeType 的源码目录 freetype-2.8。 进入到 freetype-2.8 目录,同样是三部曲:配置、编译、安装。

这里我们简单地配置一下,打开 include/freetype/config/ftoption.h 文件,如下所示:

 vi include/freetype/config/ftoption.h

该文件定义了很多的配置宏,我们可以选择使能或禁用这些配置选项,具体配置哪些功能,大家自己去 研究,每一个配置宏都有详细地解释说明。这里我们打开以下两个配置宏:

#define FT_CONFIG_OPTION_SYSTEM_ZLIB

#define FT_CONFIG_OPTION_USE_PNG

大家找到这两个宏,默认情况下,这两个都被注释掉了,所以是没有使能的;把这两个宏的注释去掉, 使能这两个配置宏。 第一个配置宏表示使用系统安装的 zlib 库,因为 FreeType 支持 Gzip 压缩文件,会使用到 zlib 库,zlib 之前我们移植好了;第二个配置宏表示支持 PNG bitmap 位图,因为 FreeType 可以加载 PNG 格式的彩色位 图字形,需要依赖于 libpng 库,这个库前面我们也是移植好了。

配置好之后

./configure --prefix=/home/dt/tools/freetype/ --host=arm-poky-linux-gnueabi --with-zlib=yes --with-bzip2=no -
-with-png=yes --with-harfbuzz=no ZLIB_CFLAGS="-I/home/dt/tools/zlib/include -L/home/dt/tools/zlib/lib" 
ZLIB_LIBS=-lz LIBPNG_CFLAGS="-I/home/dt/tools/png/include -L/home/dt/tools/png/lib" LIBPNG_LIBS=-
lpng

,保存、退出 ftoption.h 文件,接着执行如下命令对 FreeType 工程源码进行配置:

这个配置命令很长,简单地提一下,具体的细节大家可以执行"./configure --help"查看配置帮助信息。 --prefix 选项指定 FreeType 库的安装目录;--host 选项设置为交叉编译器名称的前缀,这两个选项前面 几个章节内容都已经给大家详细地解释过。 --with-zlib=yes 表示使用 zlib; --with-bzip2=no 表示不使用 bzip2 库; --with-png=yes 表示使用 libpng 库; --with-harfbuzz=no 表示不使用 harfbuzz 库。ZLIB_CFLAGS 选项用于指定 zlib 的头文件路径和库文件路径,根据实际安装路径填写; ZLIB_LIBS 选项指定链接的 zlib 库的名称; LIBPNG_CFLAGS 选项用于指定 libpng 的头文件路径和库文件路径,根据实际安装路径填写; LIBPNG_LIBS 选项用于指定链接的 libpng 库的名称。

安装目录下的文件:

进入到 FreeType 安装目录下,如下所示:

如果要使用 FreeType 库,我们需要在应用程序源码中包含 include/freetype2 目录下的 ft2build.h 头文件, 除此之外,还需要包含另一个头文件 FT_FREETYPE_H,这是一个用宏定义的头文件,其实就是 include/freetype2/freetype/freetype.h 头文件。 所以,在我们的应用程序一般是这样写:

#include <ft2build.h>
#include FT_FREETYPE_H

移植到开发板:

接下来将编译得到的动态链接库文件拷贝到开发板 Linux 系统/usr/lib 目录,在拷贝之前,需将/usr/lib 目 录下原有的 FreeType 库文件删除掉,执行下面这条命令:

rm -rf /usr/lib/libfreetype.*

删除之后,再将我们编译得到的库文件拷贝到开发板/usr/lib 目录下,也就是 FreeType 安装目录 lib 目 录下的所有库文件,拷贝的时候注意符号链接的问题。拷贝完成之后,如下所示:

freetype的使用

整个移植工作完成之后,接着简单地介绍下 FreeType 库的使用,FreeType 库支持的功能很多、提供给 用户的库函数也很多,所以笔者肯定不会给大家细聊!以介绍性为主。 FreeType 官方也提供了详细地使用帮助文档,以下便是这些文档的链接地址: https://www.freetype.org/freetype2/docs/tutorial/step1.html https://www.freetype.org/freetype2/docs/tutorial/step2.html https://www.freetype.org/freetype2/docs/reference/index.html

以下这个链接是一份中文参考文档,大家可以看一下,笔者也不知道是哪位作者编写的,写的非常详 细!http:// https://www.doc88.com/p-7178359224563.html?r=1

dpi 的概念,dpi(dots per inch)表示每英寸的像素点数,譬如 300*400dpi 表示在 水平方向,每英寸有 300 个像素点、在垂直方向上每英寸有 400 个像素点。通过点数和 dpi 可以计算出像素 点数,公式如下:

像素点数 = 点数 * dpi / 72

譬如,假设某一显示设备水平方向 dpi 为 300,已知水平方向的点数为 50,那么像素点数的计算方式 为: 50 * 300 / 72 = 208

初始化freetype库:

在使用 FreeType 库函数之前,需要对 FreeType 库进行初始化操作,使用 FT_Init_FreeType()函数完成 初始化操作。在调用该函数之前,我们需要定义一个 FT_Library 类型变量,调用 FT_Init_FreeType()函数时 将该变量的指针作为参数传递进去;使用示例如下所示:

FT_Library library;
FT_Error error;
error = FT_Init_FreeType(&library);
if (error)
fprintf(stderr, "Error: failed to initialize FreeType library object\n");

FT_Init_FreeType 完成以下操作: ⚫ 它创建了一个 FreeType 库对象,并将 library 作为库对象的句柄。 ⚫ FT_Init_FreeType()调用成功返回 0;失败将返回一个非零值错误码。

加载face对象:

应用程序通过调用 FT_New_Face()函数创建一个新的 face 对象,其实就是加载字体文件,为啥叫 face (脸),应该是一种抽象的说法!一个 face 对象描述了一个特定的字体样式和风格,譬如"Times New Roman Regular"和"Times New Roman Italic"对应两种不同的 face。 调用 FT_New_Face()函数前,我们需要定义一个 FT_Face 类型变量,使用示例如下所示:

FT_Library library; //库对象的句柄
FT_Face face; //face 对象的句柄
FT_Error error;
FT_Init_FreeType(&library);
error = FT_New_Face(library, "/usr/share/fonts/font.ttf", 0, &face);
if (error) {
/* 发生错误、进行相关处理 */
}

FT_New_Face()函数原型如下所示:

FT_Error FT_New_Face(FT_Library library, const char *filepathname,
FT_Long face_index, FT_Face *aface);

函数参数和返回值说明如下:

library:一个FreeType库对象的句柄

filepathname:字库文件路径名(一个标准的c字符串)

face_indx:某些字体格式允许把几个字体 face 嵌入到同一个文件中,这个索引指示了你想加载的 face, 其实就是一个下标,如果这个值太大,函数将会返回一个错误,通常把它设置为 0 即可!想要知道一个字体 文件中包含了多少个 face,只要简单地加载它的第一个 face(把 face_index 设置为 0),函数调用成功返回 后,face->num_faces 的值就指示出了有多少个 face 嵌入在该字体文件中。

aface:一个指向新建 face 对象的指针,当失败时其值被设置为 NULL。

返回值:调用成功返回0,失败返回一个非0值的错误码

设置字体大小:设置字体的大小有两种方式:FT_Set_Char_Size()和 FT_Set_Pixel_Sizes()。 FT_Set_Pixel_Sizes()函数 调用 FT_Set_Pixel_Sizes()函数设置字体的宽度和高度,以像素为单位,使用示例如下所示:

FT_Set_Pixel_Sizes(face, 50, 50);

第一个参数传入 face 句柄;第二个参数和第三个参数分别指示字体的宽度和高度,以像素为单位;需 要注意的是,我们可以将宽度或高度中的任意一个参数设置为 0,那么意味着设置为 0 的参数将会与另一个 参数保持相等,如下所示:

FT_Set_Pixel_Sizes(face, 50, 0);

FT_Set_Char_Size()函数

调用 FT_Set_Char_Size()函数设置字体大小,示例如下所示,假设在一个 300x300dpi 的设备上把字体大 小设置为 16pt:

error = FT_Set_Char_Size(
face,//face 对象的句柄
16*64, //以 1/64 点为单位的字体宽度
16*64, //以 1/64 点为单位的字体高度
300, //水平方向上每英寸的像素点数
300); //垂直方向上每英寸的像素点数

说明: ⚫ 字体的宽度和高度并不是以像素为单位,而是以 1/64 点(point)为单位表示(也就是 26.6 固定浮 点格式),一个点是一个 1/72 英寸的距离。 ⚫ 同样也可将宽度或高度其中之一设置为 0,那么意味着设置为 0 的参数将会与另一个参数保持相 等。 ⚫ dpi 参数设置为 0 时,表示使用默认值 72dpi。

加载字形图形

设置完成后既可以加载字符图像了,总共分为 3 步:

a)、获取字符的字形索引 :通过 FT_Get_Char_Inde()函数将字符编码转换为字形索引(glyph index),Freetype 默认使用 UTF-16 编 码类型,也就是 Unicode 编码方式,采用 2 个字节来表示一个编码值。

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值