一、freeType-2.4.10简介
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图、反走样位图的渲染。FreeType库是高度模块化的程序库,虽然它是使用ANSI C开发,但是采用面向对象的思想,因此,FreeType的用户可以灵活地对它进行裁剪。(百度百科解释)
字体引擎就是操作字体文件的一个函数或者函数集,在我们的操作系统C:\WINDOWS\Fonts下面存放了很多的字体,每个字体里面都包括很多文字形状的关键点(矢量字体),但是操作系统怎么使用这些字体文件呀?就是通过字体引擎!所以说字体引擎就是对字体文件进行解释的函数,根据文字编码在字体文件中获得能在屏幕上显示的点阵数据。(个人理解)
二、编译freetype
我们要使用freetype这个函数集(函数库),我们首先得现在我们的linux上编译安装它。下载地址:http://pan.baidu.com/share/link?shareid=310551&uk=101680913
2.1编译PC版本的freetype
# tar xjf freetype-2.4.10.tar.bz2
进入freetype-2.4.10文件夹内
#./configure
#make
#sudo make install
编译完成后,头文件部分存放在/usr/local/include下面,库文件存放在/usr/local/lib下面
2.2编译ARM版本的freetype
# tar xjf freetype-2.4.10.tar.bz2
进入freetype-2.4.10文件夹内
#./configure --host=arm-linux
#make
#sudo make DESTDIR=$PWD/tmp install
然后将得到的头文件和库文件分别拷到交叉编译工具链的头文件目录和库文件目录(我的目录)
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
三、freetype使用流程
第一: 程序文件要包括:
#include <ft2build.h>
#include FT_FREETYPE_H(这个是最基本的,使用不同的库函数要添加相应的头文件)
第二:初始化freetype库文件
FT_Init_FreeType( FT_Library *alibrary );
第三:加载字体文件(freetype是操作对象是字体文件)
FT_New_Face( FT_Library library,const char* filepathname,FT_Long face_index,FT_Face *aface );
第四:设置字体属性(比如大小、旋转)
FT_Set_el_Sizes( FT_Face face,FT_UInt pixel_width,FT_UInt pixel_height )(设置字体像素大小)
第五:根据文字的编码获得文字的点阵
FT_Load_Char( FT_Face face, FT_ULong char_code,FT_Int32 load_flags )(获得文字点阵)
第六:根据所获得的点阵进行显示
这部分的代码是用户根据的自己的需要编写,freetype库里面不提供
最后:清除工作
FT_Done_Face(FT_Face face)
FT_Done_FreeType( FT_Library library )
四、freetype简要说明
4.1 文字的glyph信息获取
如上图所示,文字的glyph信息描述了一个文字显示的宽度width,高度height,以及它的原点origin,还有下一个要显示的字符距离它最近的距离advance。这些信息可以通过调用如下函数获得:
FT_Load_Char( FT_Face face,FT_ULong char_code,FT_Int32 load_flags );
//根据字符编码获得文字的相关信息,其中包括显示的点阵信息
FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *glyph )
//为了避免获取下一个文字的信息覆盖到face中的glyph,将它提取出来保存在glyph 变量中
FT_Glyph_Get_CBox( FT_Glyph glyph,FT_UInt bbox_mode,FT_BBox *acbox )
//从glyph中获得文字显示的宽度width,高度height的信息
4.2 文字的点阵数组
文字的最终显示都是将文字的点阵信息送到显示器的内存中,linux就是将点阵送入到framebuffer中对应的内存单元。这个点阵数组组织形式:将上图的字母g划分成height行width列,那么就可以用height*width个元素的点阵数组来表示这个字母了,数组元素就是该点的灰度值(三基色的分量值) ,然后从左上角为顶点开始,按先左右再上下的方式,将这些点阵信息保存在点阵数组中去。
FT_Load_Char( FT_Face face,FT_ULong char_code,FT_Int32 load_flags );
//根据字符编码获得文字的相关信息,其中包括显示的点阵信息
点阵数组包括在face->glyph->bitmap里面
4.3 笛卡尔坐标系和LCD坐标系
上图中的矩形区域可以看成是LCD显示器对应的像素点(或者对应的像素点在内存中的存储单元),我们显示的时候就是将需要显示的内容(点阵信息)按照LCD的坐标存放在LCD显存的对应区域。比如,第一个显示的'2',阴影部分就是它的点阵信息,我们将它的点阵信息保存在LCD坐标为(3,1)的矩形存储区域。所有的字体显示都是将点阵信息从左上角开始存储到LCD坐标的某个矩形区域。
在freetype中,我们使用的是笛卡尔坐标,从图中可以看出,笛卡尔坐标和LCD坐标的x值相同,两个y值相加就是LCD的y分辨率(y方向的像素个数)。
要使'2'的原点origin显示在LCD的(3,7)位置,相当于使'2'的原点origin显示在笛卡尔的(3,8-7)位置
pen.x=3;pen.y=8-7//设置字体在笛卡尔坐标系的原点origin
FT_Load_Char( FT_Face face,FT_ULong char_code,FT_Int32 load_flags );//获得字体点阵等信息
face->glyph->bitmap//里面保存的是字体点阵
(face->glyph->bitmap_left,face->glyph->bitmap_top)
//字体点阵数组在笛卡尔坐标系的左上点的位置(3,7)
(face->glyph->bitmap_left,yres-face->glyph->bitmap_top)
//字体点阵数组在LCD坐标系的左上角坐标(3,1)
最后就将获得点阵保存在LCD坐标系的(3,1)为左上点的矩形存储区域。
五、freetype使用示例程序
http://pan.baidu.com/share/link?shareid=311045&uk=101680913