Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
CyanoHao opened this issue Apr 26, 2022 · 2 comments
Closed

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

CyanoHao opened this issue Apr 26, 2022 · 2 comments

Comments

@CyanoHao
Copy link
Contributor

描述

思源黑体通过 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 表

@Pal3love
Copy link
Owner

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

@Pal3love
Copy link
Owner

Pal3love commented Apr 27, 2022

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants