image

origin是字形显示开始的地方,下一个字体开始的位置是:origin + advance的位置,即是指定了下一个字符的origin出现的位置。advance有x方向的,当然有y方向的,不过这里没有使用,使用y方向将会使字体倾斜。

虽然有坐标基准线,但是英文字体不像汉字方方正正,如果把所有英文字体搞得像汉字一样,那么会很不好看,所以即使在已经订好基准线后,还是会另外设置字体的xmin、xmax和ymin、ymax这四个参数。

Freetype API的使用

我们来总结一下显示一个矢量字符我们都做了什么:

1、初始化一个库

2、加载字体,并用创建一个face来描述字体

3、设置字体的像素大小

4、设置字体的旋转角度以及显示位置

5、找到字型的点阵信息并记录下来

6、显示点阵

要得到上图的信息,我们需要将从face将glyph给取出来,得到box的一些数据,主要是坐标的XY最大、最小值。

首先,从face中拿到放入字体插槽里面的glyph(此操作并不影响origin glyph)。(函数API名 Extracting the glyph image)

error = FT_Get_Glyph( face->glyph, &glyph );

然后再拿出box里面的数据。(函数API名 Measuring the glyph image)

FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_TRUNCATE, &bbox );

一些API函数:

①:FT_Init_FreeType( &library );

功能:这是初始化一个库,所谓库我们可以简单的理解为一个空间,用来存放所有的资源。

②:FT_New_Face( library, argv[1], 0, &face );

功能:读取字体文件中指定类型的字体,并用face来描述它

参数1:表示库

参数2:要打开的文件

参数3:表示要加载的字体的类型,0表示任何类型都可以

参数4:face

一个文件里面可能会含有多种字体,每个字体对应着一个face,也就是说face用来描述某一种字体。

③:FT_Set_Pixel_Sizes(face, 24, 0);

功能:设置字符的像素大小

参数1:face

参数2:每行多少像素,0表示与列相同

参数3:每列多少像素,0表示与行相同

④:FT_Set_Transform( face, &matrix, &pen );

功能:设置传输

参数1:face

参数2:用于设置字体的旋转角度

参数3:用于设置字体的平显示位置,freetype文档里面的参数提示给的delta,也就是数学里面△符号,即然后把它显示到LCD中间位置,但是“我爱你”三个字符之间位置没发生改变,那么坐标(0,0)和(pen.x, pen.y)之间的位置就是delta。

image

⑤:FT_Load_Char( face, text[n], FT_LOAD_RENDER );

功能:将一个字型的点阵信息记录在face->glyph中

参数1:face

参数2:要记录的字型的编码

参数3:参数

⑥:draw_bitmap( &slot->bitmap , slot->bitmap_left , target_height - slot->bitmap_top );

功能:将字符的点阵存放在一个结构体里面

参数1:用于描述点阵信息的结构体

参数2:x坐标

参数3:y坐标

注意:我们这里的坐标是笛卡尔坐标系,也就是y坐标向上,x坐标向右!而在LCD上的显示坐标系y轴是反向的,所以显示的时候需要将y轴处理一下!