TrueType Fonts

来自osdev
Zhang3讨论 | 贡献2022年1月13日 (四) 01:48的版本 (创建页面,内容为“{{Stub}} Category:Graphical UI == 描述 == TrueType是一种将字体信息编码为文件的方法。 它是由苹果公司在20世纪80年代创建的,并在今天被广泛使用。 TrueType通过使用一系列直线和二次Bézier贝塞尔曲线来定义每个字形 (字符形状)。 这种方法意味着每个字符都是矢量图像,可以根据需要轻松地按比例放大。 TrueType文件格式具有很高的空间效率,但易于阅…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

This article is a stub! 此页面或段落为 草稿。 你可以通过更精确的编辑贡献 来帮助本wiki。

描述

TrueType是一种将字体信息编码为文件的方法。 它是由苹果公司在20世纪80年代创建的,并在今天被广泛使用。

TrueType通过使用一系列直线和二次Bézier贝塞尔曲线来定义每个字形 (字符形状)。 这种方法意味着每个字符都是矢量图像,可以根据需要轻松地按比例放大。

TrueType文件格式具有很高的空间效率,但易于阅读,并使用两个简单的原语来绘制单个字符字形。

文件格式是big endian大端的。

File Format

TypeType字体文件包含许多表,其中最重要的是:

  • 'cmap',它将单个字符代码映射到字形索引,
  • 'loca',将字形索引映射到偏移到主字形表中,以及
  • 'glyf',它存储实际的字形矢量数据本身。

显示字符

显示字符的一般操作顺序如下:

  • 找到合适的字符映射是文件的 “cmap” 部分,用于编码您拥有的字符代码。
  • 使用字符映射将字符代码映射到字形索引。
  • 在 “本地” 表中查找字形索引,以找到该字形开始的字形表中偏移量。
  • 在 “loca” 表中查找字形索引1以查找以下字形的偏移量,这使我们能够计算字形数据长度。
  • 找到字形数据并绘制出来。

Glyph字形数据深入

字形数据本身描述了一组坐标点,这些坐标点定义了直线或Bézier曲线以绘制实际的字形图像。 它由文件 “glyf” 部分中的数据块描述。

glyph字形数据包含:

  • 轮廓的计数,
  • 字符数据的边界框,
  • 基于1的点索引的数组,指示每个轮廓的最后一个点,
  • 零个或多个 “网格拟合” 提示,
  • 标记定义点的属性,
  • X坐标数据,以及
  • Y坐标数据。

Contours轮廓

轮廓是形成闭环的后续点的集合。 有些字符只有一个轮廓来绘制它们,其他字符则更多。 以下是一些示例:

  • '-' (hyphen连字符) 只有一个轮廓,围绕条外侧的路径
  • '1' (数字1) 也只有一个轮廓,围绕形状的外部
  • 'O' (大写字母O) 有两个轮廓,一个围绕形状的外部,一个围绕内部
  • '=' (等号) 有两个轮廓,每个条形周围的路径
  • '%' (%百分比符号) 有五个轮廓,围绕条形的路径以及每个圆圈内外的路径

字形数据存储字形的轮廓计数以及每个轮廓的最后一点的数组。 通过读取最后一个轮廓的点索引,您可以确定组成此字形的总共点的数量。

请注意,该文件确实显式关闭了轮廓。 例如,一个正方形将由四个点定义,并且由绘图代码通过从第四点绘制回第一点来绘制正方形的第四边。

“网格拟合” 提示

字形可以选择包含 “网格拟合” 提示。 这些是字体设计器提供的用于指定像素级别详细信息的说明,当字体呈现为位图 (栅格化) 时,应包括这些像素级别详细信息。 本文不涉及这些内容。

点数据

字形数据的其余部分形成三个字节数组,即标志,X坐标和Y坐标。

文件的点由字形数据中的一系列标志字节定义,每个标志代表字形中的一个或多个点,因此必须对标志进行解析,直到找到正确数量的点为止。 这是确定文件中存在多少个字节的标志数据的唯一方法。

每个标志字节表示有关它所代表的一个或多个点的详细信息:

  • 点是否在偏离曲线的曲线上,
  • X坐标是否有零,一或两个字节的数据,
  • Y坐标是否有零,一个或两个字节的数据,以及
  • 此标志代表多少分。

画点

On Curve / Off Curve标志用于识别特定点是否位于字符的轮廓上,还是b é zier曲线的控制点。 通过分析标志的开/关曲线位,可以确定所需的线类型:

  • OnCurve point到OnCurve point: 这是一条直线段。
  • 曲线上,曲线上,曲线上: 这是一个二次b é zier。
  • OnCurve,OffCurve,OffCurve,OnCurve: 这是两个二次b é ziers。

最后一种排列是文件格式的细微差别。 虽然文件以 “上曲线,下曲线,下曲线,上曲线” 的形式对四个点进行编码,但实际上它以 “上曲线,下曲线,上曲线,下曲线,上曲线” 的形式表示五个点。添加额外的曲线点以形成两个二次b é ziers。 (虽然我找不到任何明确的信息,但我认为上曲线点应该位于两个下曲线点之间的一半。)

外部链接