2024年3月23日发(作者:)

最近在处理一些TTF字体的相关读取和显示的程序(C语言),整理了一些资料,希望对大家有帮助。

不多说了。马上进入正文:

首先是TTF字体的概述,当然你也可以跳过这个。看2楼。

TrueType字体概述

TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,

已经变成最常用的一种字体文件表示方式,在一些特殊的场合,系统字符集不包含你要用的字体,这时候必须

使用自己的字体文件,如甲骨文等古文字处理,一般在系统盘WINDOWSFonts里,直接双击能查看是什

么样的字体。

TTF(TrueTypeFont)是一种字库名称。

字库是输出设备的一个组成部分。由于汉字不同于西方字体,字符集非常庞大,不能用单字节表示,

因此postscript level i的rip不能使用汉字,很多西文软件也不支持汉字。

桌面出版系统使用的字库有两种标准: postscript字库和truetype字库。这两种字体标准都是采用

曲线方式描述字体轮廓,因此都可以输出很高质量的字形。postscript汉字库分为显示字库和打印字库,

显示字库安装在制作计算机上,用来制作版面时显示用,通常由低分辨率的点阵字构成。打印字库要挂接

在rip上,在解释页面时由rip把需要的字库调人页面并解释成记录的点阵。 postscript汉字使用方便,

输出速度快,是输出中心必备的。

另一种常用的字库标准是truetype字库,truetype字体是windows操作系统使用的唯一字体标准,

macintosh计算机也用 truetype字体作为系统字体。truetype字体的最大优点是可以很方便地把字体

轮廓转换成曲线,可以对曲线进行填充,制成各种颜色和效果,它可以进一步变形,制作特殊效果字体,

因此经常用来制作一些标题字或花样字。 truetype字便宜,字款丰富。但一般情况厂truetype字不能

直接由rip输出。需要经过特殊处理,比如转成曲线或输出时下载,使用起来较麻烦。速度也要慢一些,

尤其是处理大量文字时很不方便,因此不适合用来作为页面的正文文字使用。

truetype字体也用来作为postscript字库的显示字用,各字库公司同时都有这两种标准的产品。因此当

使用truetype字体制作版面时,输出时仍然可以将它代换成postscript字库输出。

TTF字体的编码方式:

TrueType字体通常包含在单个TrueType字体文件中,其文件后缀为.TTF。OpenType字体是以类似于

TrueType字体的格式编码的PostScript字体。OpenType字体使用.OTF文件后缀。OpenType还允

许把多个OpenType字体组合在一个文件中以利于数据共享。这些字体被称为TrueType字体集

(TrueType collection),其文件后缀为.TTC。

TrueType字体用machintosh的轮廓字体资源的格式编码,有一个唯一的标记名"sfnt"。windows没有

macintosh的位图字体资源格式,字体目录 包含了字体格式的版本号和几个表,每个表都有一个

TableEntry结构项,TableEntry结构包含了资源标记、校验和、偏移量和每个表的大小。

首先给出字体中用到的一些数据类型定义:

Macintosh Data type OS/2 Data Type Description

uint8 BYTE 8-bit unsigned integer

int8 CHAR 8-bit signed integer

uint16 USHORT 16-bit unsigned integer

int16 SHORT 16-bit signed integer

uint32 ULONG 32-bit unsigned integer

int32 LONG 32-bit signed integer

1

shortFrac - 16-bit signed fraction

Fixed - 16.16-bit signed fixed-point number

FWord - 16-bit signed integer that describes a quantity in FUnits, the

smallestmeasurable distance in em space.

uFWord - 16-bit unsigned integer that describes a quantity in FUnits,

the smallest measurable distance in em space.

F2Dot14 - 16-bit signed fixed number with the low 14 bits representing fraction.

longDateTime- The long internal format of a date in seconds since 12:00 midnight,

January 1, 1904. It is represented as a signed 64-bit integer.

我也是尽量做到简单了,E文不好的朋友应该也可以理解这里的意思。

下面是TrueType字体目录的c语言定义:

typedef sturct

{

CHAR tag[4]; /*资源标记*/

ULONG checkSum; /*校验位*/

ULONG offset; /*表在TrueType结构体中的偏移量*/

ULONG length; /*每个表的大小*/

}TableEntry; /*此结构体为TrueType字体中的表的定义形式*/

typedef struct

{

Fixed sfntversion; /*目前所用版本皆为1.0版本,故此值为0x10000*/

USHORT numTables; /*该字体中表的数目*/

USHORT searchRange;

USHORT entrySelector;

USHORT rangeShift;

TableEntry entries[i]; /*保存着具体的表,i = numTables*/

}TableDirectory;

TrueType 字体中的所有数据都使用big-endian编码,最高位字节在最前面。TableDirectory结构中的

最后一项,每个元素保存一个表。

下面列出常用的表以及其功能:

表名 表名解释 表名说明

head 字体头 字体的全局信息

cmap 字符代码到图元的映射 把字符代码映射为图元索引

glyf 图元数据 图元轮廓定义以及网格调整指令

maxp 最大需求表 字体中所需内存分配情况的汇总数据

mmtx 水平规格 图元水平规格

loca 位置表索引 把图元索引转换为图元的位置

name 命名表 版权说明、字体名、字体族名、风格名等说明

hmtx 水平布局 字体水平布局星系:上高、下高、最大前进宽度、最小左支撑、最小右

2