Linux下矢量字库应用
Linux下矢量字库应用
1.FreeType简介
FreeType 库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,可以非常方便我们开发字体显示相关的程序功能。它支持单色位图、反走样位图的渲染。 FreeType库是高度模块化的程序库,虽然它是使用 ANSI C 开发,但是采用面向对象的思想,因此, FreeType 的用户可以灵活地对它进行裁剪。关于 freetype 的详细信息可以参考 freetype 的官方网站:https://www.freetype.org/来获取更多相关的信息。
FreeType为访问字体文件提供了一套统一的、独立于字体文件类型的、简单而易用的API。另外,一些特别类型的API可以用来访问字体文件里的特殊数据。
与大多数同类的字库不同,FreeType 2 生来就支持类似TrueType 或者 Type 1的可缩放字体类型,并且可以将字体的大纲数据(控件介绍/提示)返回给各户应用程序。
FreeType的设计是基于模块的,这些模块可以在编译时被静态链接到库中或者在运行时根据需要加载。模块可以用来支持特殊的字体格式,或者甚至是新的符号图像类型!
FreeType特意使用嵌入式系统编写,这意味着它不使用静态可写数据(也就是说,它可以直接从ROM中运行),这样客户程序就可以只为他们自己提供内存管理和输入/输出流的实现。
客户程序自己的输入/输出流可以使你轻易地使用相同的API读取基于ROM或被压缩的或远程的字体文件。多个流实现可以并行的被一个FreeType 实例使用。
你可以只编译那些你的嵌入式工程或环境需要的模块,从而有效的减小FreeType 2 的代码大小
2.下载源码编译安装
Freetype下载地址:https://www.freetype.org/
编译平台:ubuntu18.06
编译器:arm-linux-gcc
开发板:基于Cortex-A9的Tiny4412
开发板内核:Linux3.5
freetype版本:2.4.10
[wbyq@wbyq src_pack]$ tar xvf /mnt/hgfs/ubuntu/software_pack/freetype-2.4.10.tar.bz2
[wbyq@wbyq src_pack]$ cd freetype-2.4.10/
[wbyq@wbyq freetype-2.4.10]$ ./configure --prefix=$PWD/_install --host=arm-linux
[wbyq@wbyq freetype-2.4.10]$ make && make install
[wbyq@wbyq freetype-2.4.10]$ tree _install/
_install/
├── bin
│ └── freetype-config
├── include
│ ├── freetype2
│ │ └── freetype
│ │ ├── config
│ │ │ ├── ftconfig.h
│ │ │ ├── ftheader.h
│ │ │ ├── ftmodule.h
│ │ │ ├── ftoption.h
│ │ │ └── ftstdlib.h
│ │ ├── freetype.h
│ │ ├── ftadvanc.h
│ │ ├── ftbbox.h
│ │ ├── ftbdf.h
│ │ ├── ftbitmap.h
│ │ ├── ftbzip2.h
│ │ ├── ftcache.h
│ │ ├── ftchapters.h
│ │ ├── ftcid.h
│ │ ├── fterrdef.h
│ │ ├── fterrors.h
│ │ ├── ftgasp.h
│ │ ├── ftglyph.h
│ │ ├── ftgxval.h
│ │ ├── ftgzip.h
│ │ ├── ftimage.h
│ │ ├── ftincrem.h
│ │ ├── ftlcdfil.h
│ │ ├── ftlist.h
│ │ ├── ftlzw.h
│ │ ├── ftmac.h
│ │ ├── ftmm.h
│ │ ├── ftmodapi.h
│ │ ├── ftmoderr.h
│ │ ├── ftotval.h
│ │ ├── ftoutln.h
│ │ ├── ftpfr.h
│ │ ├── ftrender.h
│ │ ├── ftsizes.h
│ │ ├── ftsnames.h
│ │ ├── ftstroke.h
│ │ ├── ftsynth.h
│ │ ├── ftsystem.h
│ │ ├── fttrigon.h
│ │ ├── fttypes.h
│ │ ├── ftwinfnt.h
│ │ ├── ftxf86.h
│ │ ├── t1tables.h
│ │ ├── ttnameid.h
│ │ ├── tttables.h
│ │ ├── tttags.h
│ │ └── ttunpat.h
│ └── ft2build.h
├── lib
│ ├── libfreetype.a
│ ├── libfreetype.la
│ ├── libfreetype.so -> libfreetype.so.6.9.0
│ ├── libfreetype.so.6 -> libfreetype.so.6.9.0
│ ├── libfreetype.so.6.9.0
│ └── pkgconfig
│ └── freetype2.pc
└── share└── aclocal└── freetype2.m49 directories, 56 files
3.Windows下矢量字体存放位置
4.tiny4412 开发板示例
4.1 freetype.c文件
本文件主要实现功能:
1.初始化矢量字库,打开矢量字库文件;
2.显示矢量字体位图信息;
3.调用矢量字库完成字符串显示;
#include <stdio.h>
#include <stdlib.h>
#include "freetype.h"
struct FREE_TYPE_CONFIG FreeTypeConfig;
/*
* LCD 显示矢量字体的位图信息
* bitmap : 要显示的字体的矢量位图
* x : 显示的 x 坐标
* y : 显示的 y 坐标
*image_w,image_h 要显示的缓冲区的宽和高
*src_buf --显示的缓冲区
*/
void LCD_DrawBitmap(FT_Bitmap* bitmap,FT_Int x,FT_Int y,int image_w,int image_h,char *src_buf)
{FT_Int i,j,p,q;FT_Int x_max=x+bitmap->width;FT_Int y_max=y+bitmap->rows;/* 将位图信息循环打印到屏幕上 */for(i=x,p=0;i<x_max;i++,p++){for(j=y,q=0;j<y_max;j++,q++){if((i>x_max)||(j>y_max)||(i<0)||(j<0))continue;if(bitmap->buffer[q*bitmap->width+p]!=0){LCD_DrawPoint(i,j,0xff0000);}else{}}}
}
/*
函数功能: 初始化 FreeType 配置
*/
int InitConfig_FreeType(char *font_file)
{FT_Error error;/*1. 初始化 freetype 库*/error=FT_Init_FreeType(&FreeTypeConfig.library);if(error){printf("freetype 字体库初始化失败.\n");return -1;}/*2. 打开加载的字体文件*/error=FT_New_Face(FreeTypeConfig.library,font_file,0,&FreeTypeConfig.face);if(error){printf("矢量字体文件加载失败.\n");return -2;}return 0;
}
/*
函数功能: 释放 FreeType 配置
*/
void FreeType_Config(void)
{FT_Done_Face(FreeTypeConfig.face);FT_Done_FreeType(FreeTypeConfig.library);
}
/*函数功能: 在 LCD 屏显示一串文本数据函数参数:u32 x 坐标位置u32 y 坐标位置u32 size 字体大小wchar_t *text 显示的文本数据image_w、image_h 显示缓冲区的宽和高src_buf --要显示的缓冲区
*/
int LCD_DrawText(u32 x,u32 y,u32 size,wchar_t *text,int image_w,int image_h,char *src_buf)
{FT_Error error;int i = 0;int bbox_height_min = 10000;int bbox_height_max = 0;printf("image_w=%d,image_h=%d\n",image_w,image_h);/*3. 设置字符的像素的大小为 size*size*/error=FT_Set_Pixel_Sizes(FreeTypeConfig.face,size,0);if(error){printf("字符的像素大小设置失败.\n");return -1;}/*4. 设置字体文件的轮廓的插槽*/FreeTypeConfig.slot=FreeTypeConfig.face->glyph;/* 设置坐标为原点坐标* 将 LCD 坐标转换成笛卡尔坐标* 单位是 1/64 Point*/FreeTypeConfig.pen.x=x*64;FreeTypeConfig.pen.y=(image_h-size-y)*64;/*5. 循环的将文字显示出来*/for(i=0;i<wcslen(text);i++){FT_Set_Transform(FreeTypeConfig.face,0,&FreeTypeConfig.pen); //设置字体的起始坐标位置/*装载字符编码,填充 face 的 glyph slot 成员*/error=FT_Load_Char(FreeTypeConfig.face,text[i],FT_LOAD_RENDER);if(error){printf("装载字符编码失败.\n");return -1;}/*通过 glyph slot 来获得 glyph*/FT_Get_Glyph(FreeTypeConfig.slot,&FreeTypeConfig.glyph);/*通过 glyph 来获得 cbox*/FT_Glyph_Get_CBox(FreeTypeConfig.glyph,FT_GLYPH_BBOX_TRUNCATE,&FreeTypeConfig.bbox);/*获得字体高度的最大值和最小值*/if(bbox_height_min>FreeTypeConfig.bbox.yMin)bbox_height_min=FreeTypeConfig.bbox.yMin;if(bbox_height_max<FreeTypeConfig.bbox.yMax)bbox_height_max=FreeTypeConfig.bbox.yMax;/*画点,把笛卡尔坐标转换成 LCD 坐标*/LCD_DrawBitmap(&FreeTypeConfig.slot->bitmap,FreeTypeConfig.slot->bitmap_left,image_h-FreeTypeConfig.slot->bitmap_top,image_w,image_h,src_buf);if(FreeTypeConfig.slot->bitmap_left+size*2>image_w){FreeTypeConfig.pen.x=0; //更新 X 坐标位置FreeTypeConfig.pen.y=(image_h-size-y-size)*64; //更新 Y 坐标位置}else{/* 更新原点坐标位置 */FreeTypeConfig.pen.x+=FreeTypeConfig.slot->advance.x;FreeTypeConfig.pen.y+=FreeTypeConfig.slot->advance.y;}} return 0;
}
// 将char类型转化为wchar
// src: 源
// dest: 目标
// locale: 环境变量的值,mbstowcs依赖此值来判断src的编码方式
void CharToWchar(char *src, wchar_t *dest)
{// 根据环境变量设置localesetlocale(LC_CTYPE,"zh_CN.utf8");// mbstowcs函数得到转化为需要的宽字符大小: 计算char转为wcchar存放时实际占用空间大小.// 也可以直接传入一个大数组代替//w_size=mbstowcs(NULL, src, 0) + 1;mbstowcs(dest, src, strlen(src)+1);
}
4.2 freetype.h文件
#ifndef _FREETYPE_H
#define _FREETYPE_H#include <math.h>
#include <wchar.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_STROKER_H
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
/*定义一个结构体存放矢量字体的配置*/
struct FREE_TYPE_CONFIG
{FT_Library library;FT_Face face;FT_GlyphSlot slot;FT_Vector pen; /* untransformed origin */FT_Error error;FT_BBox bbox;FT_Glyph glyph;
};
extern void LCD_DrawPoint(int x,int y,int c);
int InitConfig_FreeType(char *font_file);
void FreeType_Config(void);
int LCD_DrawText(u32 x,u32 y,u32 size,wchar_t *text,int image_w,int image_h,char *src_buf);
void CharToWchar(char *src, wchar_t *dest);
#endif
4.3 矢量字库调用示例
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <string.h>
#include "freetype.h"
struct fb_var_screeninfo vinfo;/*可变参数结构体*/
struct fb_fix_screeninfo finfo;/*固定参数结构体*/
/*画点函数*/
void LCD_DrawPoint(int x,int y,int c)
{unsigned int *p=(unsigned int *)(lcd_p+finfo.line_length*y+x*vinfo.bits_per_pixel/8);*p=c;
}
int main(int argc,char *argv[])
{if(argc!=2){printf("格式:./app <dev/fb0>\n");return 0;}int fd=open(argv[1],2);if(fd<0){printf("文件打开失败\n");return 0;}if(InitConfig_FreeType("./simkai.ttf")){printf("初始化矢量字库失败\n");close(fd);return 0;}/*获取可变参数*/ioctl(fd,FBIOGET_VSCREENINFO,&vinfo);printf("屏幕尺寸:%d * %d\n",vinfo.xres,vinfo.yres);printf("颜色位数:%d\n",vinfo.bits_per_pixel);/*获取固定参数*/ioctl(fd,FBIOGET_FSCREENINFO,&finfo);printf("smem_len:%d\n",finfo.smem_len);printf("line_length:%d\n",finfo.line_length);lcd_p=mmap(NULL,finfo.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(lcd_p==(void *)-1){printf("映射地址失败\n");}/*清空屏幕*/memset(lcd_p,0xff,finfo.smem_len);LCD_DrawText(300,50,55,L"TINY4412",vinfo.xres,vinfo.yres,lcd_p);LCD_DrawText(200,150,55,L"嵌入式驱动开发",vinfo.xres,vinfo.yres,lcd_p);LCD_DrawText(180,250,55,L"www.wanbangee.com",vinfo.xres,vinfo.yres,lcd_p);LCD_DrawText(100,350,55,L"北京万邦易嵌科技有限公司",vinfo.xres,vinfo.yres,lcd_p);FreeType_Config();munmap(lcd_p,finfo.smem_len);close(fd);
}
4.4 Makefile文件编写
CFLAGS= -lfreetype
CFLAGS+=-L/home/wbyq/src_pack/freetype-2.4.10/_install/lib -I/home/wbyq/src_pack/freetype-2.4.10/_install/include -I/home/wbyq/src_pack/freetype-2.4.10/_install/include/freetype2
all:arm-linux-gcc app.c freetype.c -o app $(CFLAGS)cp app /home/wbyq/src_pack/rootfs/coderm app -f
-I 为指定头文件路径
-L 为指定库路径
-l 为指定库名字
5.运行效果
Linux下矢量字库应用相关推荐
- 单片机 怎调用显示屏字库_单片机巧用Windows矢量字库
1 引 言本文引用地址:http://www.eepw.com.cn/article/172177.htm 单片机控制的LED.LCD显示屏均涉及到各种字体的汉字显示.建立单片机汉字字库的传统方法有使 ...
- Linux下使用中文、字体
目录 1. 一般性问题 1.1. 不是已经有很多汉字字库了吗?为什么还要再做一个? 1.2. 为什么我的机器上的汉字显示为一个方块或者问号? 1.3. 为什么我屏幕上的汉字边界模糊不清? 1.4. 为 ...
- truetype技术和矢量字库的技术原理及实现(转)
源:truetype技术和矢量字库的技术原理及实现 广泛汉字矢量字库(HZKSLxxJ)格式 在矢量字库中,每个汉字都是以128 X 128点阵制成矢量数据.每个汉字 ...
- truetype技术和矢量字库的技术原理及实现
广泛汉字矢量字库(HZKSLxxJ)格式 在矢量字库中,每个汉字都是以128 X 128点阵制成矢量数据.每个汉字 的矢量数据都由一指针指向, 指针区在 ...
- Linux下使用中文、字体、版
月20日 Unicode BOM 发现网上某广为流传的中文帖子将Unicode字节流的标识字节(BOM, byte order mark)弄错了,正确的应该是: 00 00 FE FF UTF-32, ...
- linux运行geoserver源码,Linux 下Geoserver 的部署
之前做的是在windows下的Geoserver openlayers 的部署开发 现在需求是将这套系统移植到Linux下,首先先介绍如何在 Linux下部署Geoserver 关于Geoserver ...
- 专业的LaTeX: 在Linux下编写高质量的文档
专业的LaTeX: 在Linux下编写高质量的文档 Linux下的OpenOffice.KWord等字处理软件虽然在功能上与Microsoft Word类似,但目前在易用性和可用性方面仍然存在许多不足 ...
- Linux下I/O多路转接之select --fd_set
fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...
- Linux 下重新编译Windows下生成的Qt工程
原址:https://blog.csdn.net/Fanpei_moukoy/article/details/21613703 以下内容亲测通过 其实qt才是真正的跨平台,java简直太搞笑了,假跨平 ...
最新文章
- OpenGL材质和光照(转)part1
- 注意力机制Q K V
- 在linux中教你通过NFS实现文件共享
- 自律到极致-人生才精致:第12期
- 如何使用 Java 中执行 Windows 的 CMD 命令
- 查看服务器物理内存大小,如何看服务器的物理内存大小
- java中sesion
- Leetcode--289. 生命游戏
- STL学习笔记 ---- 由set的声明所引发的自定义比较的实现方式 作者:winterTTr(转载请注明)...
- 2015计算机一级试题及答案,2015年全国计算机等级考试一级试题及答案【精编直接打印版】.doc...
- 配置单交换机VLAN划分
- 如何成为优秀的程序员?
- Carplay车载语音通讯测试(Vehicle Communication Terminals Test)
- mstar的android方案,Mstar Android 方案.pdf
- jQuery UI 使用心得及技巧
- contest17 CF593 div2 ooxxx ooxxx ooooo
- 工具之DBeaver安装及使用
- 一天一块钱第二天翻倍_再把钱翻倍
- condaerror unable to create prefix directory check that you have sufficient permissions
- 华为ensp,wireshark3.0.0,virtualbox 5.2.22 安装包
热门文章
- 幸福就是每一个微小愿望的达成
- php 连续打印设置,教你如何设置打印机连续打印销售单/快递单的方法
- python使用openpyxl excel 合并拆分单元格
- java gb18030 转 utf-8_Java:GB18030字节数组与UTF8互转
- 关于发票的这些事儿,发票问题大汇总42个问题,15种发票不能抵扣
- 上市公司净利润增长率的计算
- Gradient Harmonizing Mechanism
- 计算机科学的鼻祖,他是现代计算机科学的鼻祖,编程界的上帝
- C语言 格式输入输出与字符输入输出
- 基于MATLAB/SIMULINK的双馈风力发电机(DFIG)并网模型