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
发布评论