目录
一、文字系统
1. 数据结构抽象
1.字符描述(FontBitMap)
2.字体文件的操作函数(FontOpr)
2. 实现Freetype代码
关键API:
-
FT_Init_FreeType(FT_Library *alibrary)
- 用法:用于初始化 FreeType 库。
- 入参:
alibrary
是一个指向FT_Library
类型的指针,用于存储初始化后的库对象。 - 回参:返回
FT_Error
类型的值,表示操作是否成功。成功返回FT_Err_Ok
。
-
FT_New_Face(FT_Library library, const char *filepathname, FT_Long face_index, FT_Face *aface)
- 用法:加载字体文件并创建一个字体面(face)对象。
- 入参:
library
:已初始化的 FreeType 库对象。filepathname
:字体文件的路径。face_index
:指定要加载的字体面索引,通常为 0 表示默认的字体面。aface
:用于存储创建的字体面对象的指针。
- 回参:返回
FT_Error
类型的值,指示操作的成功或失败。
-
FT_Set_Pixel_Sizes(FT_Face face, FT_UInt pixel_width, FT_UInt pixel_height)
- 用法:设置字体的像素大小。
- 入参:
face
:要设置大小的字体面对象。pixel_width
:字体的像素宽度。pixel_height
:字体的像素高度。
- 回参:返回
FT_Error
类型的值,表明操作的结果。
-
FT_Load_Char(FT_Face face, FT_ULong char_code, FT_Int32 load_flags)
- 用法:加载特定的字符图像。
- 入参:
face
:字体面对象。char_code
:要加载的字符的 Unicode 码点。load_flags
:加载标志,例如FT_LOAD_DEFAULT
等。
- 回参:返回
FT_Error
类型的值,指示加载是否成功。
-
FT_Set_Transform(FT_Face face, const FT_Matrix *matrix, const FT_Vector *delta)
- 用法:用于设置字体面的变换矩阵和位移向量。
- 入参:
face
:要应用变换的字体面对象。matrix
:一个FT_Matrix
结构,定义了缩放、旋转等变换操作。- 例如:
{.xx = 1.0,.xy = 0.0,.yx = 0.0,.yy = 1.0}
表示无缩放和旋转。
- 例如:
delta
:一个FT_Vector
结构,定义了位移量。
- 回参:返回
FT_Error
类型的值,表示操作是否成功。成功时返回FT_Err_Ok
。
关键结构体:
-
FT_Library
-
FT_Face
-
FT_GlyphSlot
3. 文字管理
参照下图实现font_manager.c,为上层提供更简单的接口函数:
这是个函数的实现就是根据上层的选择的文字操作方式,去调用底层的函数。
4. 单元测试
主要是实现了一个DrawFontBitMap()函数,通过PFontBitMap结构体中的数据绘制位图。
可以参考应用开发,使用freetype显示一行文字的示例代码。
5.错误记录
排查了很久,发现错误在freetype.c中的获取位图函数中
由于给下一个字符的原点赋值错误所导致的。
错误:
正确:
二、UI系统
1. 数据结构抽象
1. 按钮的名字
2. 按钮的区域
3.按钮的绘制
4.按钮的事件
typedef struct Button {
char *name;
int status;
Region tRegion;
int (*OnDraw)(struct Button *ptButton);
int (*OnPressed)(struct Button *ptButton,PDispBuff ptDispBuff,PInputEvent ptInputEvent);
}Button, *PButton;
2.按键编程
对按键进行初始化,实现抽象出来的结构体。
2.1 实现OnDraw()
需要先实现:
1. 绘制底色
void DrawRegion(PRegion ptRegion, unsigned int dwcolor)
2. 居中绘制文字
void DrawTextInButtonCenter(char *name, PRegion ptRegion, unsigned int dwColor)
①确定每一个字符的大小
② 确定第一个字符的起点
然后就可以将绘制出来的按钮刷到LCD上。
int FlushDisplayRegion(PRegion ptRegion, PDispBuff ptDispBuff)
2.2 实现OnPressed()
通过标志位status判断按键当前的状态,从而选颜色的显示。
三、页面系统
1. 数据结构抽象
typedef struct PageAction {
char *name;
void (*Run)(void *pParams);
struct PageAction *ptNext;
}PageAction,*PPageAction;
2. 页面管理器
页面管理器用来管理页面,只需要实现2个函数:
1.PageRegister:把多个页面注册进链表
2.Page(name):取出某个页面