菜单

质量保证

相关源文件

本文档涵盖了 Fira Code 字体项目中用于确保技术和视觉字体质量一致性的质量保证 (QA) 流程和工具。有关构建过程本身的信息,请参阅 构建过程

概述

QA 系统通过自动化和手动检查来确保字体质量。Fontbakery 对元数据、字形和 OpenType 特征等技术方面执行自动化验证。手动 QA 侧重于视觉正确性。在这两个过程中发现的问题都会被修复并反馈到字体文件中。

来源: googlefonts-qa/checks/FiraCode-Light.checks.md, clojure/fira_code/checks.clj

自动化质量保证

自动化 QA 主要包括两个组件:Fontbakery 验证和 Clojure 中实现的自定义检查。

Fontbakery 验证

Fontbakery 是一个全面的字体 QA 工具,可对字体执行数百项检查,以确保其符合技术规范和最佳实践。对于 Fira Code,Fontbakery 检查分为几个类别

来源: googlefonts-qa/checks/FiraCode-Light.checks.md, googlefonts-qa/checks/static/FiraCode-Regular.checks.md

字体家族检查

字体家族检查可确保字体家族的所有字重和样式之间的一致性。这包括

  • 验证所有字体具有相同数量的字形
  • 确保所有字体中的字形名称一致
  • 检查一致的 Unicode 编码
  • 验证所有等宽数字具有相同的宽度
  • 确认所有字体具有相同的版本值

来源: googlefonts-qa/checks/FiraCode-Light.checks.md:23-78

元数据检查

元数据检查可验证字体元数据的正确性和标准符合性

  • 版权声明格式
  • 字体设计师字段验证
  • 许可证验证
  • METADATA.pb 解析和内容
  • 字体家族名称一致性

来源: googlefonts-qa/checks/FiraCode-Light.checks.md:79-128

技术字形检查

这些检查可验证字体字形的技术方面

  • 字形名称有效性(符合命名约定)
  • 等宽宽度一致性
  • 垂直指标 (OS/2.usWinAscent & usWinDescent)
  • 检查 OS/2 achVendID

来源: 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))))))

这些检查确保

  • 字形的每个图层都具有相同的宽度
  • 宽度值对于等宽字体是可接受的(在 Fira Code 中应为 1200)

来源: clojure/fira_code/checks.clj:10-18

手动质量保证

手动 QA 通过关注自动化工具可能遗漏的视觉和设计方面来补充自动化检查。

轮廓检查

轮廓检查会检查字形轮廓的几何质量,尤其是在外推等可能引入错误的进程之后。

手动轮廓检查过程通常包括

  1. 使用 Glyphs App 扩展“Red Arrows”等工具来识别潜在问题
  2. 与其他字模(如 Bold)进行比较以确保一致性
  3. 在不确定时与 Fira Mono(Fira Code 的祖先)进行比较
  4. 创建背景指南作为修复时的参考

来源: googlefonts-qa/notes/outline-checks.md:1-22

常见的轮廓问题

手动 QA 识别和修复的一些常见轮廓问题包括

问题类型示例分辨率方法
笔画中的折痕U-cy 带笔画折痕平滑曲线
不正确的组件变换Zhedescender-cy 带微小组件调整组件变换参数
不成比例的元素过厚的横梁平衡厚度与其他相似元素
断开的连接在应连接形状的连字中调整点位置以确保正确连接
不必要的曲线应该是直线的曲线重新对齐点以创建直线段
弯曲的曲线具有不必要转折点的曲线简化曲线结构

来源: googlefonts-qa/notes/outline-checks.md:20-190

QA 工作流

整体 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

忽略的问题

某些自动化检查报告的问题被故意忽略,因为它们不影响字体功能或在设计上是可预期的

  • 组合标记和零宽度字形的一些等宽宽度例外
  • 复杂字形的一些轮廓计数警告
  • 字体家族名称加上样式名称长度超过 20 个字符

在这些情况下,忽略的决定记录在 QA 说明中。

来源: googlefonts-qa/notes/outline-checks.md:220-243, googlefonts-qa/notes/QA-notes.md:108-115

QA 与构建和发布流程集成

QA 与构建和发布流程紧密集成

  1. 在字体生成后运行 QA 检查
  2. 记录和优先处理问题
  3. 在发布前修复关键问题
  4. 将非关键问题纳入未来版本跟踪
  5. QA 报告存储在 googlefonts-qa 目录中以供参考

有关 QA 如何与发布流程集成的更多详细信息,请参阅 发布流程

来源: googlefonts-qa/notes/QA-notes.md:1-13