本文档涵盖了 Fira Code 字体项目中用于确保技术和视觉字体质量一致性的质量保证 (QA) 流程和工具。有关构建过程本身的信息,请参阅 构建过程。
QA 系统通过自动化和手动检查来确保字体质量。Fontbakery 对元数据、字形和 OpenType 特征等技术方面执行自动化验证。手动 QA 侧重于视觉正确性。在这两个过程中发现的问题都会被修复并反馈到字体文件中。
来源: googlefonts-qa/checks/FiraCode-Light.checks.md, clojure/fira_code/checks.clj
自动化 QA 主要包括两个组件:Fontbakery 验证和 Clojure 中实现的自定义检查。
Fontbakery 是一个全面的字体 QA 工具,可对字体执行数百项检查,以确保其符合技术规范和最佳实践。对于 Fira Code,Fontbakery 检查分为几个类别
来源: googlefonts-qa/checks/FiraCode-Light.checks.md, googlefonts-qa/checks/static/FiraCode-Regular.checks.md
字体家族检查可确保字体家族的所有字重和样式之间的一致性。这包括
来源: googlefonts-qa/checks/FiraCode-Light.checks.md:23-78
元数据检查可验证字体元数据的正确性和标准符合性
来源: googlefonts-qa/checks/FiraCode-Light.checks.md:79-128
这些检查可验证字体字形的技术方面
来源: googlefonts-qa/checks/FiraCode-Light.checks.md:236-297
除了 Fontbakery,Fira Code 还实现了 Clojure 中的自定义检查,主要侧重于宽度一致性
clojure/fira_code/checks.clj 文件包含实用函数,用于验证所有字形的宽度是否一致,这对于等宽字体至关重要。
(defn widths [font]
(doseq [g (:glyphs font)
:when (not= "0" (:export g))
:let [[w & _ :as ws] (mapv :width (:layers g))]]
(when-not (apply = ws)
(println (str "WARN glyph '" (:glyphname g) "' has different widths=" (pr-str ws))))
(when-not (width-ok? w)
(println (str "WARN glyph '" (:glyphname g) "' has unexpected width=" (pr-str w))))))
这些检查确保
来源: clojure/fira_code/checks.clj:10-18
手动 QA 通过关注自动化工具可能遗漏的视觉和设计方面来补充自动化检查。
轮廓检查会检查字形轮廓的几何质量,尤其是在外推等可能引入错误的进程之后。
手动轮廓检查过程通常包括
来源: googlefonts-qa/notes/outline-checks.md:1-22
手动 QA 识别和修复的一些常见轮廓问题包括
| 问题类型 | 示例 | 分辨率方法 |
|---|---|---|
| 笔画中的折痕 | U-cy 带笔画折痕 | 平滑曲线 |
| 不正确的组件变换 | Zhedescender-cy 带微小组件 | 调整组件变换参数 |
| 不成比例的元素 | 过厚的横梁 | 平衡厚度与其他相似元素 |
| 断开的连接 | 在应连接形状的连字中 | 调整点位置以确保正确连接 |
| 不必要的曲线 | 应该是直线的曲线 | 重新对齐点以创建直线段 |
| 弯曲的曲线 | 具有不必要转折点的曲线 | 简化曲线结构 |
来源: googlefonts-qa/notes/outline-checks.md:20-190
整体 QA 工作流将自动化和手动检查集成到开发过程中
来源: googlefonts-qa/notes/QA-notes.md, googlefonts-qa/checks/FiraCode-Light.checks.md
根据 Fontbakery 报告和 QA 说明,QA 过程中会出现几个常见问题
| 问题 | 描述 | 解决方案 |
|---|---|---|
| 字形名称合规性 | 字形名称超过 31 个字符或包含无效字符 | 根据命名约定重命名字形 |
| 供应商 ID | 未注册的 OS/2 VendorID “CTDB” | 向 Microsoft 注册正确的供应商 ID |
| 版权声明格式 | 版权声明格式不正确 | 更新以匹配规范模式 |
| 等宽一致性 | 某些字形具有不同的宽度 | 使所有字形具有相同的宽度 |
| 可变字体字重实例 | 字重值不是 100 的倍数 | 将字重实例调整为标准值 |
| PPEM 整数值 | 加粗字体未将 PPEM 四舍五入为整数 | 在 head 表标志上设置位 3 |
来源: googlefonts-qa/checks/FiraCode-Light.checks.md:232-307
| 问题 | 描述 | 解决方案 |
|---|---|---|
| 笔画中的折痕 | 应为直线笔画的区域出现不必要的曲线或角度 | 平滑点和句柄 |
| 不成比例的元素 | 横梁等元素过粗 | 调整厚度以匹配整体设计 |
| 连接不正确 | 元素未正确连接,尤其是在连字中 | 调整点位置以确保正确连接 |
| 外推伪影 | 新字重外推时引入的问题 | 与现有字重比较并纠正轮廓 |
| 曲线张力不一致 | 不同字形之间的曲线张力不一致 | 标准化句柄长度和方向 |
来源: googlefonts-qa/notes/outline-checks.md, googlefonts-qa/notes/QA-notes.md:86-148
某些自动化检查报告的问题被故意忽略,因为它们不影响字体功能或在设计上是可预期的
在这些情况下,忽略的决定记录在 QA 说明中。
来源: googlefonts-qa/notes/outline-checks.md:220-243, googlefonts-qa/notes/QA-notes.md:108-115
QA 与构建和发布流程紧密集成
googlefonts-qa 目录中以供参考有关 QA 如何与发布流程集成的更多详细信息,请参阅 发布流程。
来源: googlefonts-qa/notes/QA-notes.md:1-13