从活字到字体源码(5):字体从像素格走向轮廓
把一张 16×16 的字模放大,看到的是更大的方格;把轮廓字体放大,边缘可以重新计算。两者保存的字形信息不同,也因此有不同的维护成本。
数字字体并非只沿着点阵、轮廓单线替换。轮廓字体中也可以包含特定尺寸的位图,屏幕上的最终结果则始终要落到像素。
点阵把目标尺寸固定下来
二值的 16×16 字模用 256 个位置决定哪里亮、哪里不亮。显示时可以直接使用这组像素,对特定分辨率来说,横画宽几个像素、字内空隙留在哪里都能精确安排。
代价是尺寸绑定。12px、16px 和 24px 的理想字形通常需要分别设计;把已有点阵简单放大只会得到更大的像素块,缩小则可能丢掉笔画。中文还需要在多个尺寸维护大量字符,工作量会随覆盖范围增加。
因此,一套设计得好的小字号点阵,可能比未经调整的缩小轮廓更清楚。后者虽然几何描述更平滑,细笔画却可能落在两个像素之间,灰度一分摊就发虚。
轮廓把边界保存成几何数据
轮廓字体用点与曲线描述字形边界,渲染器按目标字号缩放,再栅格化成屏幕像素。设计者可以从同一套轮廓输出多种尺寸,维护的重点转成了几何形态。
可缩放只解决表示方式。一个复杂汉字缩到很小时,内部空间仍可能不足;细横可能变淡,粗笔画可能粘连。需要检查的是最终像素,而不只是矢量编辑器里放大的漂亮边缘。
控制点决定曲线怎样弯
二次贝塞尔曲线由两个端点和一个控制点描述,三次曲线增加到两个控制点。控制点通常不在最终曲线上,负责影响方向与弯曲程度。
实心点表示端点,空心点表示控制点,虚线只是控制关系。图里的曲线用于解释数学结构,不是某款字体的真实 glyph。
TrueType 的 glyf 表使用轮廓点与二次曲线;PostScript / CFF 轮廓常用三次曲线。字体工具能够在相应格式之间处理轮廓,但转换与优化需要关注误差、点数和兼容性,不能只改文件后缀。
对开发者来说,这种表示允许程序读取和变换字形。移动一条横线、组合现有部件、导出 SVG,都可以直接操作轮廓数据。结果是否协调,仍需重新构建字体观察。
Hinting 影响目标尺寸下的栅格化
字体缩放后,笔画不一定刚好落在像素边界。Hinting 提供在目标尺寸下调整或约束栅格化的线索,例如让某些笔画对齐网格、维持笔画的一致性;TrueType 的说明介绍了这套技术。
它会影响显示时的几何位置,因此不能笼统说成「完全不改变字形」。更准确地说,设计源轮廓与针对某个尺寸执行的调整应分别理解。
抗锯齿利用边缘像素的覆盖程度改善阶梯感,次像素渲染则还依赖显示设备与渲染策略。同一字体在不同系统、屏幕和缩放比例下,黑度与边缘可能不同。这也是大图看起来正常,小字号仍要单独验收的原因。
TTF、OTF 与源码分别承担什么
.ttf、.otf 是常见的交付字体文件扩展名。OpenType 文件规范以字体表组织数据,既可以使用 TrueType 轮廓,也可以使用 CFF 等描述。仅靠扩展名,不能把它们判断为「旧字体」与「新字体」。
应用会读取文件里的轮廓、字符映射、宽度和名称等信息。字体项目则常维护 .glyphs、UFO、Designspace 或其他源文件,它们还能保存设计阶段的数据与构建信息。
对 Ligconsolata Next 来说,长期维护入口是 .glyphs 和生成脚本;TTF 用于安装、排版和验证。发现问题后回到源码修,下一次构建才会继续包含修正。
总结
点阵为特定像素尺寸直接设计结果,轮廓保存可以缩放的几何边界。轮廓进入屏幕后仍要栅格化,hinting、抗锯齿和设备共同影响最终显示。因此字体检查需要两种视角:放大看结构,在真实字号里看阅读效果。文件格式能够容纳字形,不能代替这些设计判断。