Skip to content

find-font v0.7.0-alpha

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Nov 14:18
· 5 commits to main since this release

这版加的是「为什么有些字显示成空白」的答案。

下载

文件 说明
find-font-0.7.0-alpha-win-x64.zip 解压后双击 FindFont.exe,需要 .NET 8 桌面运行时

新功能:字形缺失检测

以前只能看到「这一行有空白」,但空白有两种完全不同的成因,修法也不一样:

情况 现象 真实原因
无映射 某个字的位置是空白 cmap 里根本没有这个码位,字体不知道自己该画什么
空字形 大片汉字都是空白 cmap 里有映射,但 glyf 里那个字形是空的 —— 字体拿占位符凑数

现在每个字体在样本文字下都会核对一遍,列表里出现「缺字 21/24」这样的徽标,下面一行列出到底缺了哪几个字:

  • 左栏新增两个开关:只看缺映射 / 只看空字形,互不混淆
  • 右栏「档案」里给出细分数值与完整缺字清单
  • 改样本文字后自动重新检测(300 ms 防抖),探测集相同则直接命中缓存

实测本机 1380 个字体、24 个不同码位:约 140 ms 跑完,命中缓存约 1 ms,其中 518 个字体在默认样本下有缺字。

实现要点

  • 直读 cmap(支持 fmt 0/4/6/12,按平台与 format 打分挑最佳子表)+ loca/glyf 定向随机读,不整表解析 —— 全部 cmap 表加起来 48 MB,整读完全不可接受
  • 空字形的判据是 loca[gid+1] - loca[gid] == 0,叠加 glyf 开头的 numberOfContours == 0;负数表示复合字形,有轮廓
  • 真 CFF 轮廓(只有 CFF 表、没有 loca 的 .otf)不猜空字形,只报无映射并显式标注「轮廓格式不支持空字形检测」 —— 启发式判断在实测里误差太大
  • 检测跑在扫描之后的并行任务里,首屏不等它;结果按(路径、字面、探测集)缓存

顺带的修正

  • .otf 后缀不等于 CFF:Noto Sans SC (TrueType).otf 是 TrueType 轮廓,照常判空字形
  • 测试从 42 项增到 49 项,新增 7 项都用本机真实坏字体验证(流丽行书.ttf 的无映射、日文毛笔字体.ttf 的空字形)