- 看再多的文档都不如去看代码,也不如去写一个代码

- 解压freetype库
- 在PC上编译freetype库
交叉编译free type库(并安装到交叉编译工具链中)
- 解压完后,也要配置
- install.cross是交叉编译的相关文档
- 配置:./configure —host=arm-linux
- 不配置prefix时,最后make install时默认安装在虚拟机的/usr/local目录下
- prefix指定安装前缀,一般交叉编译时安装到交叉编译工具链上

- 编译出来的头文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/user/include目录下

- 编译出来的库文件可以放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib 目录下
- 因为头文件和库文件最后放置位置不同,配置时先不指定—prefix参数
- 编译完后再分别拷贝到相应目录去
- make
- make DESTDIR=$PWD/tmp install 安装到tmp临时目录下
- 把./tmp/usr/local/lib/* 拷贝到/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
- cp ./tmp/usr/local/lib/* /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib -d -rf
- 头文件也一样拷贝到对应目录下
- -d 链接文件保持作为链接文件拷贝
- -rf 递归拷贝(包括目录)

- 交叉编译程序
- 解压完后,也要配置
交叉编译程序
- arm-linux-gcc -0 example1 example1.c
移动头文件位置- 加上动态库(freetype、math库):arm-linux-gcc -0 example1 example1.c -lfreetype -lm
执行
- freetype使用需要用到字体文件,所以要将字体文件拷贝到开发板上(如:simsun.ttc)
- freetype执行要用到自身的动态库,所以动态库也要拷贝到开发板上
- 开发板上执行程序

- 指定输入字符集:arm-linux-gcc -finput-charset=GBK -o example1 example1.c -lfreetype -lm
实现在LCD上输出矢量字体
- freetype字体使用的是笛卡尔坐标系,原点在左下角
- LCD屏幕输出显示的原点是左上角
- 所以要先对坐标进行转化

- lcd_x 表示矢量字体在LCD上的x坐标(左上角为原点)
- lcd_y 表示矢量字体在LCD上的y坐标(左上角为原点)
- 笛卡尔坐标系将屏幕左下角视为原点,所以和LCD的坐标系x轴相等,y轴为 yres-lcd_y -16(y轴分辨率减去LCD坐标Y轴大小)
- 无法转换字符集

- 编译时指定国标码-finput-charset=GBK,提示无法转换GBK为UTF-8

- 输出字符集也设为GBK:-fexec-charset=GBK, 同样的提示

- man gcc; /chatset搜索字符集

- gcc的字符编码支持是通过iconv实现的

用iconv执行GBK转换为UTF-8

- 第128个字符无法识别,删掉后继续执行转换
- 直到转换完成后,就可以用来编译了
- 编译时指定国标码-finput-charset=GBK,提示无法转换GBK为UTF-8
字符集转换成功后,再次执行编译:

strtoul

- 把字符串转成长整型
在LCD上显示多行矢量字体
从左边起开始显示几行文字
- 显示第二行前,要把上一行的边框大小算出来;才能够描绘下一行文字
- 1. 先描画
- 2. 算出边框
设置字体大小为24*24- 则确定坐标为:

由glyph得到所谓的Cbox- cbox中就含有含有每一个文字的xMin,xMax,yMin,yMax等信息

- 一行文字的高可以算出来:line_box_ymax - line_box_ymin
- 第二行文字的LCD坐标可以确定为:(0, ymax-ymin+24)
- 24可以换成第二行最高的的字体,这里采用粗暴的方法直接写24
- 则笛卡尔坐标系的y坐标为: yres-(ymax-ymin+24)
居中显示几行文字
- 1. 先算出一行文字的边框大小
- 2. 再确定坐标并描画

计算边框大小
void compute_string_bbox(TGlyph glyphs[], FT_UInt num_glyphs, FT_BBox *abbox ){FT_BBox bbox;int n;bbox.xMin = bbox.yMin = 32000; /* 最小的边框初始设为一个很大的值 */bbox.xMax = bbox.yMax = -32000;for ( n = 0; n < num_glyphs; n++ ){FT_BBox glyph_bbox;FT_Glyph_Get_CBox(glyphs[n].image, FT_GLYPH_BBOX_TRUNCATE, &glyph_bbox );if (glyph_bbox.xMin < bbox.xMin)bbox.xMin = glyph_bbox.xMin;if (glyph_bbox.yMin < bbox.yMin)bbox.yMin = glyph_bbox.yMin;if (glyph_bbox.xMax > bbox.xMax)bbox.xMax = glyph_bbox.xMax;if (glyph_bbox.yMax > bbox.yMax)bbox.yMax = glyph_bbox.yMax;}*abbox = bbox;}





