嵌入式应用实例→电子产品量产工具→字符显示系统(可支持多种字符显示,但这里只用了FreeType一种)代码分析和上板测试记录

头文件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
);

参数解析

  1. library

    • 类型:FT_Library
    • 描述:FreeType 库的实例,通常在初始化时通过 FT_Init_FreeType(&library) 创建。它是管理 FreeType 资源的上下文对象。
  2. filepathname (代码中 aFineName)

    • 类型:const char*
    • 描述:字体文件的路径,通常是 .ttf, .otf, .pfa, 或其他支持的字体格式文件。
    • 作用:指定加载的字体文件。
  3. face_index

    • 类型:FT_Long
    • 描述:指定字体文件中要加载的字体索引,通常为 0(表示加载字体文件的第一个字体)。
    • 作用:某些字体文件可能包含多个字体,这个参数用于指定要加载哪一个。
  4. 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
);

参数解析

  1. face (代码中 g_tFace)

    • 类型:FT_Face
    • 描述:已经通过 FT_New_Face 加载的字体对象。
    • 作用:指定要设置尺寸的字体。
  2. pixel_width (代码中 g_iDefaultFontSize)

    • 类型:FT_UInt
    • 描述:设置字符的宽度,以像素为单位。这里咱们设置为自定义的 g_iDefaultFontSize,如果设为 0,表示按照 pixel_height 计算宽度,保持字符比例。
    • 作用:在等宽字体中使用较多,或者需要强制设置字体宽度时使用。
  3. pixel_height (代码中的 0)

    • 类型:FT_UInt
    • 描述:设置字符的高度,以像素为单位。如果设为 0,高度将根据 pixel_w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值