- 看再多的文档都不如去看代码,也不如去写一个代码
- 解压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;
}