• 看再多的文档都不如去看代码,也不如去写一个代码
  • image.png
  • 解压freetype库
    • image.png
  • 在PC上编译freetype库
    • image.png
  • 交叉编译free type库(并安装到交叉编译工具链中)

    • 解压完后,也要配置
      • image.png
    • install.cross是交叉编译的相关文档
    • 配置:./configure —host=arm-linux
      • 不配置prefix时,最后make install时默认安装在虚拟机的/usr/local目录下
      • prefix指定安装前缀,一般交叉编译时安装到交叉编译工具链
      • image.png
      • 编译出来的头文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/user/include目录下
      • image.png
      • 编译出来的库文件可以放入:/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 递归拷贝(包括目录)
    • image.png
    • 交叉编译程序
  • 交叉编译程序

    • arm-linux-gcc -0 example1 example1.c
    • image.png移动头文件位置
    • 加上动态库(freetype、math库):arm-linux-gcc -0 example1 example1.c -lfreetype -lm
  • 执行

    • freetype使用需要用到字体文件,所以要将字体文件拷贝到开发板上(如:simsun.ttc)
    • freetype执行要用到自身的动态库,所以动态库也要拷贝到开发板上
      • image.png
    • 开发板上执行程序image.png
    • 指定输入字符集:arm-linux-gcc -finput-charset=GBK -o example1 example1.c -lfreetype -lm
  • 实现在LCD上输出矢量字体

    • freetype字体使用的是笛卡尔坐标系,原点在左下角
    • LCD屏幕输出显示的原点是左上角
    • 所以要先对坐标进行转化image.png
    • lcd_x 表示矢量字体在LCD上的x坐标(左上角为原点)
    • lcd_y 表示矢量字体在LCD上的y坐标(左上角为原点)
    • 笛卡尔坐标系将屏幕左下角视为原点,所以和LCD的坐标系x轴相等,y轴为 yres-lcd_y -16(y轴分辨率减去LCD坐标Y轴大小)
  • 无法转换字符集image.png
    • 编译时指定国标码-finput-charset=GBK,提示无法转换GBK为UTF-8image.png
    • 输出字符集也设为GBK:-fexec-charset=GBK, 同样的提示image.png
    • man gcc; /chatset搜索字符集
      • image.png
      • gcc的字符编码支持是通过iconv实现的
      • image.png
      • image.png用iconv执行GBK转换为UTF-8
        • image.png
        • image.png
        • 第128个字符无法识别,删掉后继续执行转换
        • 直到转换完成后,就可以用来编译了
  • 字符集转换成功后,再次执行编译:image.png

  • strtoul

    • image.png
    • 把字符串转成长整型

在LCD上显示多行矢量字体

  • 从左边起开始显示几行文字

    • 显示第二行前,要把上一行的边框大小算出来;才能够描绘下一行文字
    • 1. 先描画
    • 2. 算出边框
    • image.png设置字体大小为24*24
    • 则确定坐标为:image.png
    • image.png由glyph得到所谓的Cbox
    • cbox中就含有含有每一个文字的xMin,xMax,yMin,yMax等信息image.png
    • 一行文字的高可以算出来:line_box_ymax - line_box_ymin
    • 第二行文字的LCD坐标可以确定为:(0, ymax-ymin+24)
      • 24可以换成第二行最高的的字体,这里采用粗暴的方法直接写24
      • 则笛卡尔坐标系的y坐标为: yres-(ymax-ymin+24)
  • 居中显示几行文字

    • 1. 先算出一行文字的边框大小
    • 2. 再确定坐标并描画
    • image.png
    • 计算边框大小

      1. void compute_string_bbox(TGlyph glyphs[], FT_UInt num_glyphs, FT_BBox *abbox )
      2. {
      3. FT_BBox bbox;
      4. int n;
      5. bbox.xMin = bbox.yMin = 32000; /* 最小的边框初始设为一个很大的值 */
      6. bbox.xMax = bbox.yMax = -32000;
      7. for ( n = 0; n < num_glyphs; n++ )
      8. {
      9. FT_BBox glyph_bbox;
      10. FT_Glyph_Get_CBox(glyphs[n].image, FT_GLYPH_BBOX_TRUNCATE, &glyph_bbox );
      11. if (glyph_bbox.xMin < bbox.xMin)
      12. bbox.xMin = glyph_bbox.xMin;
      13. if (glyph_bbox.yMin < bbox.yMin)
      14. bbox.yMin = glyph_bbox.yMin;
      15. if (glyph_bbox.xMax > bbox.xMax)
      16. bbox.xMax = glyph_bbox.xMax;
      17. if (glyph_bbox.yMax > bbox.yMax)
      18. bbox.yMax = glyph_bbox.yMax;
      19. }
      20. *abbox = bbox;
      21. }
    • image.png