字体文件定制及软件的设计

2019-09-10 07:22:44闫文奇
现代信息科技 2019年17期

摘  要:嵌入式设备上常用的有两种类型的字体:点阵型字体和TrueType类型字体。点阵字体很难进行缩放,否则会失真,而TrueType文件并不存在这个问题。但因TrueType字体文件较大,并不能直接使用在嵌入式系统中。因此,在使用TrueType字体前须对其进行适当的定制,只选取用到的字符,这样可以使字体文件的大小减小很多,更适合使用在嵌入式系统上。

关键词:嵌入式设备;字体文件;TrueType;造字程序

中图分类号:TP311.1     文献标识码:A 文章编号:2096-4706(2019)17-0005-04

Abstract:Two type of fonts are used most on embedded device,the lattice and the TrueType font. It is almost impossible to resize the lattice or distortion will occur while there’s no the same problem on TrueType font. However,the full size TrueType font are usually too big to be used on embedded device directly. Therefore,TrueType fonts should be customized properly before using them,and only the characters used should be selected,which can reduce the size of font files a lot and make them more suitable for use in embedded systems.

Keywords:embedded device;font file;TrueType;font program

0  引  言

TrueType字体现今在PC机上的使用已经非常广泛,然而在嵌入式系统中,字体主要还是以点阵型为主。究其原因主要为嵌入式系统资源有限,而TrueType字体占用资源和空间较多,虽然嵌入式系统的资源和性能较原来已经好了很多,但是TrueType字体动辄几十兆的大小还是太过庞大。随着显示精度的提高,点阵型字体已无法达到显示要求,TrueType字体取代点阵型字体已是大势所趋,为了克服TrueType字体文件较大的难题,在使用TrueType字体时必须对其进行裁剪,只选取字体文件中将来会用到的字符重新生成新的字体文件,以减小字体文件的大小[1]。

1  TrueType字体简介

TrueType字体技术是由苹果和微软联合推出的一种新型数字字形描述技术,用数学函数描述字体轮廓外形,含有字形结构、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。其字体外形轮廓采用二次贝塞尔曲线,相对之前PostScript等字體,曲线方程次数降低,但配合其丰富的指令集,在实现轮廓曲线光滑性的前提下,大大提高了解释器的工作速度。加之其公布字体文件结构,可实现在不同系统间进行移植并方便用户加入已实现的字符,因此TrueType字体得以作为标准字体,应用如此广泛。

2  TrueType字体分析

2.1  TrueType字体结构

TrueType字体文件数据内容由表头、一系列描述表目录和描述表组成,并由不同表中的数据组合起来描述字体中的每个字,其结构如图1所示。

2.2  表头

TTF文件开头12字节为表头(offset table),其内容及数据类型如下(其中FIXED类型为带符号整数小数各16位的32位定点实数):

FIXED     version //文件版本号

USHORT  numTables //描述表数目

USHORT  searchRange //快速查找范围

USHORT  entrySelector //描述表入口

USHORT  rangeShift //范围调整

其中最重要的为numTables,其余项都可以由其计算得到,详细信息可以参考TrueType说明文件[2]。

2.3  描述表目录

表头(offset table)之后紧跟着描述表目录,其个数为numTables个,每个描述表目录项都占有16个字节,其结构如下:

ULONG  tag //描述表名称

ULONG  checksum //描述表校验和

ULONG  offset //描述表偏移

ULONG  length //描述表字节长度

2.4  描述表

TrueType类型字体中包含的描述表最多可达到24个,其中10个必须,14个可选,描述表目录项按照表名字(tag)的升序排列。本文仅介绍10个必须的表,如下所示,可选表信息可参考TrueType说明文件,且其不会影响字体裁剪。

cmap //字符代码到文字序号映射表

glyf   //字符轮廓信息表

head //字体文件头信息表

hhea //水平度量头信息表

hmtx //垂直尺寸信息表

loca //文字序号到位置索引信息表

maxp //最大值描述表

name //字体名表

post //PostScript信息

OS/2 //OS/2与Windows度量信息

10个表中与字体裁剪关联较大的表有cmap、glyf、loca等三个;head、hhex、hmtx、maxp、name等五个表也会有所涉及,下面对cmap、loca、glyf三个表进行简要介绍。

2.4.1  cmap表

cmap表给出了字符由其本身编码到字体中其序号的映射关系。譬如汉字“文”,其Unicode编码为0x6587,根据这个编码值通过cmap表便可以索引到“文”字在字体文件中的序号,进而可以根据字形轮廓绘制出“文”字。cmap表结构如图2所示。

表头格式为:

USHORT  cmap_version//cmap版本号

USHORT  cmap_tables//cmap子表数

描述表目录格式为:

USHORT  Platform_ID

USHORT  Platform_Encoding

ULONG   Offset

描述子表有四種格式,分别对应Format0、Format2、Format4、Format6,下面以Format4为例,简述轮廓信息查找过程。

Format4描述子表格式如下:

USHORT  format//子表格式,此处为4

USHORT  length//子表长度(字节计)

USHORT  version//子表版本

USHORT  segCountX2//子表分段数*2

USHORT  searchRange//快速查找范围

USHORT  entrySelector//入口值范围

USHORT  rangeShift//偏移调整

//每段结束字符代码

USHORT  endCount[segCount]

USHORT  reservedPad//保留对齐,为0

//每段开始字符代码

USHORT  startCount[segCount]

//字符轮廓序号调整量

USHORT  idDelta[segCount]

//每段映射子表所有字符轮廓序号存储

//位置(在glyphIdArray数组中)相对

//当前位置的偏移量

USHORT  idRangeOffset[segCount]

//文字轮廓序号数组(变长)

USHORT  glyphIdArray[]

其根据字符编码查找字符轮廓索引(index)流程如图3所示。

2.4.2  loca表

loca表记录了每个文字的轮廓数据信息在glyf表中相对于glyf表初始位置的偏移,其依据cmap表中查询到的字符索引,由该字符索引确定偏移位置,loca表结构比较简单(其中char_index为字符轮廓索引):

USHORT offsets[char_index];

整个查询过程如图4所示。

2.4.3  glyf表

glyf表是TrueType文件中重要的表,其存储了文字的轮廓描述信息,以及一系列的指令信息。glyf表较为复杂,不再将其表中变量一一说明,具体说明见TrueType文件。这里仅介绍简单及复杂字符轮廓的读取过程如图5所示。

3  软件设计

为达到字体的定制功能,字体定制软件要能够读取某一字体文件的内容,对其进行解析,根据需要对其裁剪,最后保存所需的部分,字体定制软件结构框图如图6所示。

字体定制软件主要由两个模块组成:字体文件读取模块、字体子集定制模块,软件采用基于MFC架构的C++语言开发[3]。

考虑到TTF文件中表数的众多,如果对每个表分别进行独立操作,将会使软件的工程量变得很大,同时结构还会变得相当松散,这是比较差的设计方式。考虑到实际过程中并不需要对所有的表都进行修改,并且利用C++语言的继承和多态的特性,可以将对描述表的读取通过以下方式实现。

所有的描述表都需要实现内容读取、内容保存的功能,具有一定的共性,所以可以设计一个基类CTaleInfo类,而具体的每个表都可以从CTableInfo类进行派生,如图7所示。

类的定义如下所示:

Class CTableInfo

{

public:

//保存表信息

virtual void SetSave();

//从硬盘读取文件

virtual void Load();

//将表信息写入文件

virtual void Store() const;

//将信息附加到表中

virtual void AppendGlyfByDoc(){};

//复制表信息

virtual void Duplicate();

//设置表对应的TTF文件类

virtual void SetTtfDoc();

}

软件界面如图8所示。

4  结  论

该软件已经开始于工程中使用,其操作方便、运用直观,可对字体按需定制。经过裁剪的文件大小适合于嵌入式系统,大大提高了系统的运行效率。

参考文献:

[1] 吕强,史磊,杨季文.TrueType字体文件格式初探 [J].计算机研究与发展,1995(11):23-31+60.

[2] TrueType 1.0 Font Files,Technical Specification(Revision 1.66) [Z].Microsoft Corporation,1995.

[3] 孙鑫.VC++深入详解(修订版) [M].北京:电子工业出版社,2012.

作者简介:闫文奇(1988.10-),男,汉族,江苏赣榆人,工程师,硕士,研究方向:控制器软件开发。