FreeType 学习笔记
py = (1-t)2 .Ay + 2t(1-t).By + t2 .Cy
类型
|
名称
|
描述
|
Fixed
|
sfnt version
|
0x00010000 for version 1.0.
|
USHORT
|
numTables
|
Number of tables.
|
USHORT
|
searchRange
|
(Maximum power of 2 <= numTables) x 16.
|
USHORT
|
entrySelector
|
Log2(maximum power of 2 <= numTables).
|
USHORT
|
rangeShift
|
NumTables x 16-searchRange.
|
类型
|
名称
|
描述
|
ULONG
|
tag
|
4 -byte identifier.
|
ULONG
|
checkSum
|
CheckSum for this table.
|
ULONG
|
offset
|
Offset from beginning of TrueType font file.
|
ULONG
|
length
|
Length of this table.
|
#include
#include FT_FREETYPE_H
|
FT_Library library;
error = FT_Init_FreeType( &library );
|
error = FT_New_Face( library,
"/usr/share/fonts/truetype/arial.ttf",
0,
&face );
|
error = FT_New_Memory_Face( library,
buffer, /* first byte in memory */
size, /* size in bytes */
0, /* face_index */
&face );
|
error = FT_Set_Char_Size(
face, /* handle to face object */
0, /* char_width in 1/64th of points */
16*64, /* char_height in 1/64th of points */
300, /* horizontal device resolution */
300 ); /* vertical device resolution */
error = FT_Set_Pixel_Sizes(
face, /* handle to face object */
0, /* pixel_width */
16 ); /* pixel_height */
|
glyph_index = FT_Get_Char_Index( face, charcode );
error = FT_Load_Glyph(
face, /* handle to face object */
glyph_index, /* glyph index */
load_flags ); /* load flags, see below */
error = FT_Render_Glyph( face->glyph, /* glyph slot */
render_mode ); /* render mode */
|
error = FT_Set_Transform(
face, /* target face object */
&matrix, /* pointer to 2x2 matrix */
&delta ); /* pointer to 2d vector */
|
字符显示与字库
Ø字库分类:
Ø 按历史版本划分,如汉字库:GB 字库、GBK 字库、GB18030 字库等等
Ø 按字符字形划分如:宋体、楷体、方正舒体、黑体、MingLiU 、Gulim 等
Ø 按字模存在形式划分为,常见的有:点阵字库、矢量字库、PostScript 字库、图形字库等
字符显示与字库
ØGB2312字库
Ø 为了便于管理GB2312 字库,通常采用的是区位码( 内码 – 0xA0A0) 进行检索
Ø 假设:有一字符串str, 当前字号占s_size 字节,求当前字符在字库中的偏移地址offset_addr:
s_row = *(str)-0xA0;
s_col = *(str+1)-0xA0;
offset_addr=(94*(s_row-1)+(s_col-1))*s_size;
Ø 读取点阵信息到buffer :
fseek(fp,offset_addr,SEEK_SET);
fread(buffer,s_size,1,fp);
矢量字体的应用
矢量字体的应用
Ø概述
ØFreeType 2 被设计为一种占用空间小、高效、高度可定制的、并且可以产生可移植的高品质输出(符号图像)。可以被用在诸如图像库、展出服务器、字体转换工具、图像文字产生工具等多种其它产品上
ØFreeType 2 的发行遵循两个开源许可:BSD 样式的FreeType License 和GPL
Ø 它提供一个简单的、易用的并且统一的接口实现对多种字体文件的访问
矢量字体的应用
Ø概述
Ø 尽管点阵字体在时间和空间性能上都有较佳的表现,但是由于缺乏灵活性,不便于改变字体的大小和风格
Ø 矢量字体不像点阵字体那样直接记录字符的字模数据,而是记录字体描述信息,其中最重要的两部分是outline 和hint
Øoutline(轮廓): 这是用来描述字体的基本手段,它一般由直线和贝塞尔曲线组成。贝塞尔曲线是一条由三个点确定的曲线,假设这三点的坐标是(Ax, Ay) 、(Bx, By) 和(Cx, Cy) ,那么曲线方程为:
px = (1-t)2.Ax + 2t(1-t).Bx + t2.Cx
py = (1-t)2.Ay + 2t(1-t).By + t2.Cy
矢量字体的应用
Ø概述
Øhint(精调):Outline 已经描述字体的表现形式,但是数学上的正确对人眼来说并不见得合适,特别是缩放到特定的大小和分辨率的时候,字体可能变得不好看,或者不清析。hint 指的是一系列的技术,用来精调字体,让字体变得更美观,更清析
Ø字符影射表(charmap): 字符对应的字体数据称为glyph ,字体文件中通常带有一个字符映射表,用来把字符映射到对应glyph 的索引值
矢量字体的应用
Ø概述
Ø 矢量字体有多种不同的格式,其中TrueType 用得最为广泛,它的扩展名通常为OTF 或者TTF
Ø 它的文件内容由几部分组成,文件头、表目录和表。文件头描述了版本号和表的数目等信息,表目录记录了表的偏移量和大小,表则是表的实际数据
Ø 矢量字体的处理比较麻烦,即要进行矢量计算,又要进行精调处理,相对于点阵字体处理要慢
矢量字体的应用
Øfreetype2应用
Øfreetype-2.1.10下载地址:http://download.chinaunix.net/download.php?id=28421&ResourceID=3295
或http://savannah.nongnu.org/download/freetype/
Ø编译配置:
./configure --host=arm-linux --prefix=/xxx/xxx
make
make install
矢量字体的应用
Øfreetype2应用
Ø 应用程序常用头文件包含:
#include
#include
#include
#include
Ø 应用程序编译:
export C_INCLUDE_PATH=/home/xiuhai/Desktop/libfree/include/:/home/xiuhai/Desktop/libfree/include/freetype2/
矢量字体的应用
Øfreetype2应用
arm-linux-gcc -L/home/xiuhai/Desktop/libfree/lib/ -lfreetype -o t freetype_test.c
Ø 运行时要拷贝动态库到开发板lib 下,TTY 字体库可以拷贝到应用程序指定的位置
Ø 当新建一个face 对象时,freetype2 默认选择Unicode 字符表
矢量字体的应用
ØFreetype2应用程序编写
Ø 初始化freetype:
FT_Library library;
FT_Init_FreeType( &library );
Ø 加载字体创建face :
FT_Face face;
FT_New_Face(library, "simfang.ttf",0, &face)
Ø 设置字体大小( 宽/ 高) :
FT_Set_Pixel_Sizes(face, 16,0)
矢量字体的应用
ØFreetype2应用程序编写
Ø 根据目标编码获取字符在字库中的索引:
FT_UInt glyph_index;
glyph_index = FT_Get_Char_Index(face, unicode);
Ø 按指定的大小加载字符的glyph: FT_Load_Glyph(face,glyph_index,FT_LOAD_DEFAULT)
Ø 将指定的glyph 转换成bitmap
FT_Render_Glyph(face->glyph,FT_RENDER_MODE_MONO)
矢量字体的应用
ØFreetype2应用程序编写
ØFT_GlyphSlot 结构体部分成员信息:
bitmap_left: 距离左边的空余像素
bitmap_top: 用于描述顶部空白区 (bitmap.rows - bitmap_top)
bitmap.rows: 字符所占的行数
bitmap.width: 字符所占的列数
bitmap.pitch: 绝对值表示一行所占字节数
bitmap.pixel_mode: 像素模式,1 指单色的,8 表示反走样灰度值
bitmap.buffer:glyph 的点阵位图内存绶冲区
矢量字体的应用
ØFreetype2其他高级应用
Ø 指定字符编码集:
FT_Select_Charmap(face, FT_ENCODING_GB2312);
Ø 字形变换:
仿射、旋转、文字渲染、缩放、自居调整等
多国语开发
多国语开发
Ø概述
Ø 对于一个嵌入式产品多语言支持,一般分两部分:
Ø 一是终端本地显示界面,如菜单、图标等
Ø 二是来自外部的文件,需要在终端上进行显示
Ø 针对上面两点,都离不开Codepage 与Unicode ,同时还要有支持各国语言的内码表及各国语言内码所对应的字库或Unicode 字库
Ø 开发工作主要集中在编码转换和字库索引这块,编码转换方式多样,效率也会不同
多国语开发
Ø概述
Ø 对于字符显示的方案:
Ø 对于本地字符串显示,由于内容比较少,可以将字符串定义在头文件中,为了便于随时修改,也可以做成XML 文件
Ø 字符串可以是文本也可以是内码( 字符串内码数组)
Ø 可以采用各国内码字库,不过得熟悉其编码规则,所以不怎么采用
Ø 一般采用Unicode 字库,或TTY 字库
ØFreetype2 为多国语显示提供了很大方便,我们只需要佣用相应语言的TTY 字库就可以方便的显示字符了
FreeType 学习笔记相关推荐
- Freetype学习笔记(轉)
Freetype学习笔记 转载时请注明出处:http://blog.csdn.net/absurd GTK+(基于DirectFB)的字体绘制是通过pango+freetype+fontconfig三 ...
- Freetype学习笔记
Freetype学习笔记 转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd 作者联系方式:Li XianJing <xianjimli at hotmail ...
- RISCV学习笔记7.8(开源虚拟机篇)--AlmaLinux虚拟机安装modelsim
上一期的教程我们安装了wine,这一期来教大家安装仿真软件modelsim哈. 1.软件下载 请参考:RISCV学习笔记6.5(软件篇)–ubuntu18.04虚拟机安装modelsim se 10. ...
- Intel oneAPI学习笔记之环境变量配置运行一个PyTorch程序
前面两篇文章: Intel oneAPI学习笔记之基本概念&六大工具包一览 Intel oneAPI 学习笔记之 Centos 下安装 Intel® oneAPI Base Toolkit 和 ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
最新文章
- Lua面向对象利用metamethod重载运算符
- C语言字符串输出函数puts()的作用是什么
- ajax获取qq音乐源码,ajax请求QQ音乐
- 指定tensorflow运行的GPU或CPU设备
- Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型
- Python 面向对象(二)
- iOS 数据解析之使用TFHpple解析html
- 【转载】程序员历史之一
- linux apach2 内存,Apache2.2.14(Ubuntu)修改最大连接数
- 矩阵特征值的一些特点
- redis雪崩和穿透、击穿的解决方法
- 2021Java实现关注公众号登陆网站
- 远程重启h3c路由器_H3C路由器远程登陆命令 -192.168.0.1 路由器怎么设置|192.168.1.1登陆|路由器设置密码-路由器网...
- AAAI2019论文
- vbs字符串正则_VBS正则表达式语法
- 清华大学赵明国:AI芯片 +机器人,突破算法瓶颈
- 【MySQL】索引的使用和优化
- CF 1718 A2. Burenka and Traditions (hard version) 贪心 1900
- partition X does not end on cylinder boundary
- 一个轻巧高效的多线程c++stream风格异步日志(二)
热门文章
- 【转】全国80几所重点大学ftp资源库(经常逛逛可能有惊喜哦)很难收集的,知道其他的友友可以留言完善
- 配置NFS服务器和NFS客户端
- Paradigms Homework1 一个超小型二元一次方程组计算器
- Angular官网学习4:Angular入门,你的第一个应用(4)输出
- 如何做好图片页面seo 优化
- MATLAB频谱分析程序(转)
- 视频码流传输协议srtp/srtcp详细介绍
- 电子计算机发明于1946年对不对,国家公务员测验考试常识题.doc
- SerialException:Cannot configure port something went wrong
- java面向对象 程序设计题_java面向对象程序设计练习题