- 通过点阵字库把一个字母/汉字的字模取出来在LCD上显示,这种方式有个缺点:一旦选定了点阵文件后,这个文字的大小就定死了,不能对文字进行缩放
- 矢量字体
- 在矢量字体文件中,存的不再是字体具体的像素点阵,而是存储关键点(能够确定字体若干条曲线的关键点)
- 显示时,使用数学曲线(贝塞尔曲线)进行描绘、连接关键点
一个字体可能需要多条曲线构成所谓的“闭合曲线”,然后再在这些闭合曲线的区域内填充颜色
- 填充闭合曲线的内部空间
- freetype库就是用来处理矢量字体的
freetype使用详解(中文):https://wenku.baidu.com/view/2d24be10cc7931b765ce155b.html
字体设计师设计出字体的形状,程序员配合将字体的关键点及相对位置提取出来,制作为字库文件
各种字库文件
- 字库文件中存这字体的glyph 字形(关键点)
- 想象一个文字的显示过程
- 给定一个文字,’A’ :0x41 可以得到的是文字的编码(确定编码值)
- 根据编码值去字体文件中找到”glyph” (字体文件是否支持GBK、Unicode等编码,由charmap字符映射表指出)
- 字体文件中不但含有glyph,还可能还有多个charmap;支持多种编码
- 设置字体大小
- 用某些函数把glyph里的点缩放为设置的字体大小
- 将字体转换为位图点阵(最终还是显示位图)
- 在LCD上显示出字体
写代码显示文字
- 初始化:FT_Init_FreeType( &library )
- 加载字体Face:
- 从字体文件加载:FT_New_Face(打开字体文件)
- 从内存加载:FT_New_Memory_Face
- 从其他源加载:压缩文件、网络等
- 访问Face单元
- 设置当前像素大小(字体大小)
- FT_Set_Char_Size()
- FT_Set_Pixel_Sizes()
选择charmap(可选,默认为Unicode码)
error = FT_Select_CharMap(
face, /* target face object */
FT_ENCODING_BIG5 ); /* encoding */
根据字符的编码值加载glyph
- glyph_index = FT_Get_Char_Index( face, charcode ); 转换字符编码成glyph索引
从Face中加载一个glyph
error = FT_Load_Glyph(
face, /* handle to face object */
glyph_index, /* glyph index */
load_flags ); /* load flags, see below */
将glyph转换为位图
error = FT_Render_Glyph(
face->glyph, /* glyph slot */
render_mode ); /* render mode */
变换glyph
- 移动
- 旋转
error = FT_Set_Transform(
face, /* target face object */
&matrix, /* pointer to 2x2 matrix matrix矩阵可以用来执行旋转角度 */
&delta ); /* pointer to 2d vector delta偏移位置*/
FT_Load_Char( face, text[n], FT_LOAD_RENDER );等效于FT_Load_Glyph、FT_Get_Char_Index 、FT_Get_Load_Glyph三个函数,并且直接得到位图
- 第一次编译时,使用的是GBK编码,提示错误
- 第二次编译时,通过VSCode改成UTF-8编码保存,可以编译通过