Repository navigation
find-font v0.7.0-alpha
Pre-release
Pre-release
·
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的空字形)