数码相框_freetype理论(3)
上一节中,是从点阵字库里面,把英文字母或者汉字的字模取出来,在LCD上显示。
这种方法缺点就是:一旦选定点阵文件后,这个文字的大小就确定下来了,不能缩放。
矢量字体
将汉字的笔画边缘用直线段描述成封闭的曲线,并将线段各端点的坐标经压缩存储,如下图所示:
矢量字体文件:
1、存放的是若干条闭合曲线的关键点
2、使用数学曲线 (贝塞尔曲线) 连接关键点。
3、填充闭合曲线的内部空间
freetype库(处理矢量字体)
例如在字体文件simsun.ttc中,前面会有一个charmaps(编码格式GBK、Unicode...),还有对应的glyph。由于每个汉字的笔划不一样,从而每个汉字数据长度也不同,所以只能采用索引的方法。因而每种矢量字库都是由两部分组成,一部分是汉字的索引信息,一部分是汉字的字形(glyph)数据。
字体文件中,含有charmaps(含有多种编码)。字体文件中,每个文字就是一个glyph(含有关键点)
想象一个文字的显示过程:
1、给定一个文字,‘A’--0x41,"中"--GBK、unicode、BIG5
2、根据“编码值”从字体文件中找到“glyph”(glyph含有关键点)
3、设置字体大小
4、用某些函数把glyph里的点缩放为"字体大小"
5、把glyph转换为位图点阵
6、在LCD上显示出来
怎么写代码:
freetype是一个开源的字体引擎,支持多种字符集编码(utf-8等)
freetype库下载:https://sourceforge.net/projects/freetype/files/freetype2/2.4.10/
参考:freetype-doc-2.4.10\freetype-2.4.10\docs\tutorial\step1.html或者https://wenku.baidu.com/view/e7149f6748d7c1c708a14574.html(中文)
face对应一个字体文件,例如:simsun.ttc(新宋体)
1、Initialize the library初始化库:FT_Init_FreeType()
2、选择Charmap(字符编码GBK、BIG5),默认为Unicode:FT_Select_CharMap()
3、Load a font face加载字体:FT_New_Face(打开字体文件)
4、Setting the current pixel size设置字体大小:
- FT_Set_Char_Size()
- FT_Set_Pixel_Size()
5、根据字符的编码值,加载glyph
- 根据编码值找到对应的索引值:glyph_index = FT_Get_Char_Index(face, charcode)
- 从face字体文件中取出glyph:FT_Load_Glyph(face, glyph_index, ...)
- 转换为位图:FT_Render_Glyph()
6、Glyph transformations变换(移动、旋转)
FT_Set_Transform(face, &matrix, &delta),matrix矩阵,可以设置旋转角度;delta偏移位置,移动到其他位置。