Pal3love / dream-han-cjk

Dream Han Sans & Serif: open source pan-CJK font families with enormous range of weights.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

建议:按照 design space 严格线性插值的黑体

CyanoHao opened this issue · comments

描述

思源黑体通过 avar 表把用户看到的 wght 值 (user scale) 分段线性映射 OpenType VF 插值算法所用的内部坐标 (design space),如下图所示。具体的数值见 source-han-sans#297 中的讨论

linear-0

梦源黑体按照 user scale 线性插值,如上图所示,反映到 design space 就是较细的一端太稀疏,也就是主页上所描述的问题。

如果按照 design space 进行线性插值,就可以保证笔画粗细严格地线性变化。参照下图,反映到 user scale 上,就是把较细的一端加得更密集。(或许可以说和等比版“异曲同工”,但个人感觉这一插值方式在 wght = 350 突变点附近的观感比等比版更好。)

linear-1

demo

demo.zip

如下图,右边是按 design space 线性插值的版本。相比左边按 user scale 线性插值的版本,右边的版本在字重的分布上更加均匀。

compare

实现

  • 建议新增一个版本,原来的线性版和思源黑体的字重严格对应,不应该丢。
  • 只要像等比版一样预先计算好每个字重所对应的 wght (user scale) 即可,并不需要真正去操作 design space。例如,上图的第 6 个样本在 design space 中是 wght = 5/13 ≈ 0.385,在 [350, 400] → [0.32, 0.39] 这一区间,于是线性映射到 user scale 中的 (5/13 - 0.32) ÷ (0.39 - 0.32) × 50 = 396.15。
  • demo 的 14 个字重是为了方便和现有的线性版对比,实际不一定要采用 14 字重。

关于宋体

思源宋体的 user scale 和 design space 的对应关系接近线性。如下图,按 user scale 插值的结果相对黑体来说要好得多,也对应了主页上的描述。(当然,提供一个严格线性插值的版本也不错。)

user scale design space
250 0
300 0.095
400 0.21
500 0.36
600 0.51
700 0.73
900 1

linear-2

更多思考

是否有一个(比较容易给出数学描述的)参数能反映人眼对黑度的感受?如果按照那个参数来线性插值,效果应该更好。

举个例子:在 Resource Han Rounded 中,我发现人眼感受到的圆角程度基本上可以用“缺失的面积”(正比于圆角半径的平方)来描述,按这一关系写入 avar 表之后,圆角程度变化看起来就比较均匀了

参考

OpenType 标准 avar 表

很棒的建议!其实我一开始思考过是否要考虑avar的影响,当时觉得思源的avar可能没那么大突变,就没在意。看了你的图之后,发觉还是得考虑avar。我会先自己试一下,不过我的 proposal 会更简单一些:直接删掉 VF 字体文件的avar表,继续使用现行的 wght 量化值,这样就不需要考虑 design space -> user scale 的换算了。

过来更新一下,扔掉avar之后的线性插值无论黑体还是宋体观感都非常均匀,不过黑体还是稍微有点挤压细体字重。我又试了几套参数,发现某种二次多项式组合对黑体效果不错,具体参数已经更新在文档和脚本里了。我现在暂时还没找到一个 one-size-fit-all 的模型能够完美反映人眼对黑度的感受,还处于摸索阶段。

再次感谢你的建议!我已经把这个 issue 的实现更新到项目里面啦。不过我没有再保留 user scale 版本(原来的“线性版”),因为那个版本的黑度实在不够均匀,维持两套版本的使用体验也很糟糕。与其这样,不如只做一个版本,把黑度和字重做到足够细腻即可。如果用户真对思源字重有严格要求,直接使用思源原版就可以了,这个项目没必要重复。