头文件include\font_manager.h
中定义的重要结构体
结构体FontBitMap
typedef struct FontBitMap {
Region tRegion;
int iCurOriginX;
int iCurOriginY;
int iNextOriginX;
int iNextOriginY;
unsigned char *pucBuffer;
}FontBitMap, *PFontBitMap;
结构体Region tRegion表示这个字符的显示区域,结构体tRegion的定义如下:
typedef struct Region {
int iLeftUpX;
int iLeftUpY;
int iWidth;
int iHeigh;
}Region, *PRegion;
其中(iLeftUpX, iLeftUpY)表示这个区域的左上顶点的坐标, iWidth表示这个区域的宽度,iHeigh表示这个区域的高度。
用FreeType矢量字库来显示每一个字符,则还需当前字符的基点坐标(iCurOriginX, iCurOriginY),即上图中的origin点的坐标,下一个字符的基点坐标(iNextOriginX, iNextOriginY),具体如下图所示:
那我们怎么得一个字符的FontBitMap
信息呢?可以定义名叫“FontOpr”的结构体来进行与字库相关的操作,通过调用它里边的成员函数GetFontBitMap,就可以得一个字符的FontBitMap
信息,介绍如下。
结构体DispOpr
typedef struct FontOpr {
char *name;
int (*FontInit)(char *aFineName);
int (*SetFontSize)(int iFontSize);
int (*GetFontBitMap)(unsigned int dwCode, PFontBitMap ptFontBitMap);
struct FontOpr *ptNext;
}FontOpr, *PFontOpr;
这个结构体叫字库操作结构体,通过它,可以得到字库的一系列操作方法。
成员函数FontInit 表示字库的初始化函数,其参数aFineName表示字库的名字。
成员函数SetFontSize用于设置字库的字体大小。
成员函数GetFontBitMap用于获得某个字符的位图信息。
文件font\freetype.c
的分析
文件font\freetype.c
的主要功能
文件font\freetype.c
主要是用来实现对fretype字库的相关操作。
定义一个结构体FontOpr
的全局实例
static FontOpr g_tFreetypeOpr = {
.name = "freetype",
.FontInit = FreeTypeFontInit,
.SetFontSize = FreeTypeSetFontSize,
.GetFontBitMap = FreeTypeGetFontBitMap,
};
这没什么好说的,在这个C文件中,我们关键是要实现这个实例中需要的各成员函数。
freetype的初始化函数FreeTypeFontInit()
static int FreeTypeFontInit(char *aFineName)
{
FT_Library library;
int error;
error = FT_Init_FreeType( &library ); /* initialize library */
if (error)
{
printf("FT_Init_FreeType err\n");
return -1;
}
error = FT_New_Face(library, aFineName, 0, &g_tFace ); /* create face object */
if (error)
{
printf("FT_New_Face err\n");
return -1;
}
FT_Set_Pixel_Sizes(g_tFace, g_iDefaultFontSize, 0);
return 0;
}
代码error = FT_New_Face(library, aFineName, 0, &g_tFace );
这段代码中调用了 FreeType 库的 FT_New_Face
函数,用于加载字体文件并创建一个新的字体对象。在嵌入式 Linux 开发中,使用 FreeType 通常与文字渲染有关,尤其是在需要显示不同字体样式或动态文本的场景下。
以下是对这段代码的详细分析:
函数原型
FT_EXPORT(FT_Error) FT_New_Face(
FT_Library library,
const char* filepathname,
FT_Long face_index,
FT_Face* aface
);
参数解析
-
library
- 类型:
FT_Library
- 描述:FreeType 库的实例,通常在初始化时通过
FT_Init_FreeType(&library)
创建。它是管理 FreeType 资源的上下文对象。
- 类型:
-
filepathname
(代码中aFineName
)- 类型:
const char*
- 描述:字体文件的路径,通常是
.ttf
,.otf
,.pfa
, 或其他支持的字体格式文件。 - 作用:指定加载的字体文件。
- 类型:
-
face_index
- 类型:
FT_Long
- 描述:指定字体文件中要加载的字体索引,通常为 0(表示加载字体文件的第一个字体)。
- 作用:某些字体文件可能包含多个字体,这个参数用于指定要加载哪一个。
- 类型:
-
aface
(代码中g_tFace
)- 类型:
FT_Face*
- 描述:指向
FT_Face
的指针,用于接收新加载的字体对象。 - 作用:
FT_Face
包含了字体的元信息(如字符映射、轮廓信息、度量信息等)以及用于文本渲染的资源。
- 类型:
返回值
- 返回类型:
FT_Error
- 描述:函数调用的状态码,返回值为 0 表示成功,否则表示失败并包含错误代码。
代码FT_Set_Pixel_Sizes(g_tFace, g_iDefaultFontSize, 0);
这段代码使用 FreeType 的 FT_Set_Pixel_Sizes
函数设置字体的像素大小,以便后续渲染文本。它与字体的显示尺寸和渲染效果直接相关。
函数原型
FT_EXPORT(FT_Error) FT_Set_Pixel_Sizes(
FT_Face face,
FT_UInt pixel_width,
FT_UInt pixel_height
);
参数解析
-
face
(代码中g_tFace
)- 类型:
FT_Face
- 描述:已经通过
FT_New_Face
加载的字体对象。 - 作用:指定要设置尺寸的字体。
- 类型:
-
pixel_width
(代码中g_iDefaultFontSize
)- 类型:
FT_UInt
- 描述:设置字符的宽度,以像素为单位。这里咱们设置为自定义的
g_iDefaultFontSize
,如果设为0
,表示按照pixel_height
计算宽度,保持字符比例。 - 作用:在等宽字体中使用较多,或者需要强制设置字体宽度时使用。
- 类型:
-
pixel_height
(代码中的0
)- 类型:
FT_UInt
- 描述:设置字符的高度,以像素为单位。如果设为
0
,高度将根据pixel_w
- 类型: