转载地址:http://blog.csdn.net/tech_pro。若是侵权用于商业用途,请联系博主,否则将追究责任。                   https://blog.csdn.net/TECH_PRO/article/details/73437735             </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div class="htmledit_views" id="content_views">

一、freetype简介

FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,可以非常方便我们开发字体显示相关的程序功能。它支持单色位图、反走样位图的渲染。FreeType库是高度模块化的程序库,虽然它是使用ANSI C开发,但是采用面向对象的思想,因此,FreeType的用户可以灵活地对它进行裁剪。关于freetype的详细信息可以参考freetype的官方网站:https://www.freetype.org/来获取更多相关的信息。

二、基本开发环境

PC机:Ubuntu9.10

交叉工具版本 :gcc version 4.3.2

开发板:JZ2440

linux内核版本:Linux-3.4.10

freetype版本:Freetype-2.4.10

要想使用freetype矢量字体库来开发,必须先要下载这个矢量字体库,可以从官网:https://www.freetype.org/下载,也可以从我上传的资料点击这里下载。下载完成后将这个矢量字体库编译安装到交叉编译工具链和开发板的根文件系统当中(具体过程可以自己去搜索)。

三、基本开发步骤

1、打开LCD液晶设备

为了使用freetype矢量字体库来显示文字,首先要把和硬件LCD液晶相关的显示字体操作的API接口实现。

1.1 打开LCD设备,获取相关参数,映射显存到用户空间

这部分具体代码实现如下:
  1. /* 以可读可写方式打开LCD设备驱动文件 */
  2. fd_fb = open("/dev/fb0", O_RDWR);
  3. if(fd_fb == -1)
  4. {
  5. printf("can't open /dev/fb0!\n");
  6. return -1;
  7. }
  8. /* 获取液晶屏设备的可变参数 */
  9. ret = ioctl(fd_fb, FBIOGET_VSCREENINFO, &var);
  10. if(ret == -1)
  11. {
  12. printf("can't ioctl for /dev/fb0!\n");
  13. return -1;
  14. }
  15. /* 获取液晶屏设备的固定参数 */
  16. ret = ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix);
  17. if(ret == -1)
  18. {
  19. printf("can't ioctl for /dev/fb0!\n");
  20. return -1;
  21. }
  22. /* 获取相关的显存信息 */
  23. screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
  24. line_width = var.xres * var.bits_per_pixel / 8;
  25. pixel_width = var.bits_per_pixel / 8;
  26. /* 将液晶显存映射到用户空间 */
  27. fbmem = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
  28. if(fbmem == (char *)-1)
  29. {
  30. printf("mmap for /dev/fb0 error!\n");
  31. return -1;
  32. }
  33. /* 将液晶屏清为黑色 */
  34. lcd_clear_screen(BLACK);

1.2 实现像素显示和清屏接口

像素显示是所有液晶屏显示的最基本的调用接口,通过它可以实现 各种各样的显示技巧,那么这个函数的具体实现如下:

  1. /* 在液晶屏上面显示一个像素
  2. * x : 表示x坐标
  3. * y : 表示y坐标
  4. * color : 表示像素显示的颜色
  5. */
  6. void lcd_put_pixel(int x, int y, int color)
  7. {
  8. /* 获取像素点在显存中的位置 */
  9. unsigned char *pen8 = fbmem + y * line_width + x * pixel_width;
  10. unsigned short *pen16 = (unsigned short *)pen8;
  11. unsigned int *pen32 = (unsigned int *)pen32;
  12. int red, green, blue;
  13. /* 判断一个像素点所占的位数 */
  14. switch(var.bits_per_pixel)
  15. {
  16. case 16: // RGB = 565
  17. {
  18. red = (color >> 16) & 0xff;
  19. green = (color >> 8) & 0xff;
  20. blue = color & 0xff;
  21. *pen16 = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
  22. break;
  23. }
  24. case 32:
  25. {
  26. *pen32 = color;
  27. break;
  28. }
  29. default :
  30. {
  31. printf("don't support this size of pixel : %d\n", var.bits_per_pixel);
  32. break;
  33. }
  34. }
  35. }

清屏函数的实现也是经常用到的,它的主要作用就是把屏幕清成同一种颜色,方便文字、图像等的显示,它的具体实现如下所示:

  1. /* 液晶屏清屏
  2. * color : 表示清屏颜色
  3. */
  4. void lcd_clear_screen(int color)
  5. {
  6. memset(fbmem, color, screen_size);
  7. }

2、初始化库

初始化库,会创建一个freetype库的实例,具体实现如下:

  1. /* 初始化freetype库 */
  2. error = FT_Init_FreeType( &library );
  3. if(error)
  4. {
  5. printf("FT_Init_FreeType error!\n");
  6. return -1;
  7. }

3、加载字体文件

加载字体,创建一个face对象,用它来描述加载的字体的类型,具体的实现如下:

  1. /* 打开加载的字体文件 */
  2. error = FT_New_Face( library, argv[1], 0, &face );
  3. if(error)
  4. {
  5. printf("FT_New_Face error!\n");
  6. return -1;
  7. }

argv[1] : 传入加载的字体文件的名称。

4、设置字体大小

我们这里通过像素的形式来设置字体的大小,设置字体的大小为24*24,具体实现如下:

  1. /* 设置字符的像素的大小为24*24 */
  2. error = FT_Set_Pixel_Sizes(face, 24, 0);
  3. if(error)
  4. {
  5. printf("FT_Set_Pixel_Sizes error!\n");
  6. return -1;
  7. }

5、根据字符的编码值,加载glyph

  1. FT_Set_Transform(face, 0, &pen); // 设置字体的起始坐标位置
  2. /* 装载字符编码,填充face的glyph slot成员 */
  3. error = FT_Load_Char( face, wcstr1[i], FT_LOAD_RENDER);
  4. if(error)
  5. {
  6. printf("FT_Load_Char error!\n");
  7. return -1;
  8. }

6、获取字体的位图信息,通过液晶屏显示出来

这个函数的具体实现如下:

  1. /* LCD显示矢量字体的位图信息
  2. * bitmap : 要显示的字体的矢量位图
  3. * x : 显示的x坐标
  4. * y : 显示的y坐标
  5. */
  6. void lcd_draw_bitmap( FT_Bitmap* bitmap, FT_Int x, FT_Int y)
  7. {
  8. FT_Int i, j, p, q;
  9. FT_Int x_max = x + bitmap->width;
  10. FT_Int y_max = y + bitmap->rows;
  11. /* 将位图信息循环打印到屏幕上 */
  12. for(i = x, p = 0; i < x_max; i++, p++)
  13. {
  14. for(j = y, q = 0; j < y_max; j++, q++)
  15. {
  16. if((i > x_max) || (j > y_max) || (i < 0) || (j < 0))
  17. continue;
  18. if(bitmap->buffer[q * bitmap->width + p] != 0)
  19. {
  20. lcd_put_pixel(i, j, WHITE);
  21. }
  22. else
  23. {
  24. lcd_put_pixel(i, j, BLACK);
  25. }
  26. }
  27. }
  28. }

以上就简单的介绍了整个freetype的开发基本过程,完整的内容可以参考freetype的官方网站:https://www.freetype.org/,也可以参考这篇文章:https://wenku.baidu.com/view/2d24be10cc7931b765ce155b.html

附录:完整代码实现请从以下链接下载

http://download.csdn.net/download/tech_pro/9873843

`

韦东山的数码相框-free type库相关推荐

  1. 韦东山数码相框项目进度一

    数码相框进度一 项目需求分析 程序架构 点阵字符显示 参考文章: 韦东山数码相框任务需求分析 项目需求分析        程序架构 1. 为了提高程序的复用性,将应用程序分为两个进程,进程之间通过so ...

  2. 韦东山 数码相框 项目学习(四)简易的TXT文档显示器(电纸书)

    韦东山 数码相框 项目学习(四)简易的TXT文档显示器(电纸书) 有了前面关于LCD.freetype的学习,已经可以开始TXT文档显示器的编写了.整个实现过程并不复杂,必须要弄清楚的是freetyp ...

  3. 韦东山 数码相框 项目学习(五)libjpeg-turbo的移植

    韦东山 数码相框 项目学习(五)libjpeg-turbo的移植 效果图 能够在100ask STM32MP157上显示一张JPG图片 一.下载源码 首先去libjpeg-turbo官网下载源码,这里 ...

  4. 韦东山 数码相框 项目学习 (七)awtk的移植

    韦东山 数码相框 项目学习 (七)awtk的移植到百问网STM32MP157 awtk是国内一个优秀的开源GUI引擎,gitee网址在这里 由于LVGL无法直接显示JPG和PNG等格式的图片,折腾起来 ...

  5. 002_韦东山嵌入式Linux应用开发基础_实操碰到的问题集锦

    嵌入式Linux应用开发基础_韦东山教程思考笔记 配合<嵌入式Linux应用开发完全手册V5.1_IMX6ULL_Pro开发板> 文件目录 访问根/目录下,Filesystem Root目 ...

  6. 移植QT5.6到韦东山JZ2240嵌入式开发板(史上最最最最最详细的QT移植教程)

    首先感谢http://blog.csdn.net/lizuobin2/article/details/52673494的博主,应该是韦东山团队的老师,说实话,拿到JZ2440的板子很长时间了,每次都有 ...

  7. 韦东山 嵌入式Linux应用开发基础知识 上【gcc makefile 输入设备

    1 main的输入参数,并且在命令行运行文件的时候输入 我的练习 先写了个单纯输出的hello 按照教程里那样写hello 所以gcc编译过程应该是 先创建一个.c文件 gcc -c -o hello ...

  8. 3.数码相框-通过freetype库实现矢量显示

    本章主要内容如下: 1)矢量字体原理 2)使用freetype库实现矢量字体显示 1. 矢量字体原理 将汉字的笔划边缘用直线段描述成封闭的曲线,并将线段各端点的坐标经压缩存储,如下图所示: 由于每个汉 ...

  9. 韦东山视频教程视频的章节和要点

    第一部分 ARM体系结构与裸机实验 韦东山Linux视频第1期 第01课 环境搭建及工具.概念介绍 第1部分的细化,以后就在Linux上工作了,环境必须先建好 第02课 GPIO实验 写出第1个裸板程 ...

最新文章

  1. a按钮居中显示 bootstrap_Excel合并后居中,跨越合并,及跨列居中的区别你都知道吗...
  2. jtable根据内容自动调整列宽
  3. EPUB CFI 规范
  4. [OpenCV] -- win7下配置OpenCV的Qt开发环境
  5. python之os模块
  6. .NET 6 全新指标 System.Diagnostics.Metrics 介绍
  7. 力压腾讯!《原神》连续5个月成中国手游海外收入冠军
  8. C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果。
  9. Java Web从前端到后台常用框架介绍
  10. 打开 Freetextbox 的 InsertImageFromGallery 及如何接收 ftb.imagegallery.aspx 返回的图片信息...
  11. 关于软件逆向工程的一些不错博客
  12. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句倒装句(Reduced Clauses、Inverted Sentences) 【完结】...
  13. 机器学习十大算法案例
  14. codesmith mysql 模板_CodeSmith代码自动生成器 JAVA模版的制作---CodeSmith+MySQL+MyEclipse 10...
  15. 服务器容灾性能,容灾和性能
  16. 完美解决idea Maven Cannot reconnect
  17. 学生用计算机重启,学生用计算器咋关机
  18. 1离线TiDB-Ansible 部署问题-总结
  19. Java身份证号校验
  20. jenkins docker 编译verify出现crash的问题

热门文章

  1. php接收mq,php的mq客户端获取队列方法改造
  2. 通过demo学习OpenStack开发所需的基础知识 -- 单元测试
  3. android soap webservice 数据流传输,Android利用Soap读取WebService并且解析XML的DataSet数据...
  4. 心灵鸡汤可以作为学习材料吗?-好的学习材料的重要性
  5. [Microsoft Office] Office 2019及Microsoft 365账户无法登录或白屏问题
  6. 第5章 - 二阶多智能体系统的协同控制 --> 离散时间系统一致性
  7. 什么是序列化?如何实现序列化
  8. mysql单表查询实验心得_5000字总结MySQL单表查询,新手看这一篇足够了!
  9. 清除mac其他文件的免费软件:OmniDiskSweeper
  10. linux系统中socket错误码:EINTR和EAGAIN的处理