ttf 字体的一点问题

💡 原文中文,约2000字,阅读约需5分钟。
📝

内容提要

作者发现渲染汉字时的高度问题与字体文件中的ascent和descent值有关,阿里巴巴普惠体不遵守一致性。作者修改了引擎代码解决问题,并验证了字体bug猜想。

🎯

关键要点

  • 引擎渲染的汉字高度低于标称像素高度,存在70+像素的问题。
  • stb truetype库提供了两个计算字模大小的API,作者建议使用stbtt_ScaleForPixelHeight()。
  • 字体文件中有两处描述ascent和descent值,分别在hhea表和OS/2表中。
  • 微软设计的OS/2表与Apple的hhea表存在冗余信息,可能与其代码实现风格有关。
  • 大部分字体的ascent和descent值在两张表中一致,但阿里巴巴普惠体不遵守这一点。
  • 阿里巴巴普惠体在hhea表和OS/2表中的ascent和descent值不同,导致计算缩放比时出现问题。
  • stbtt_ScaleForMappingEmToPixels()能得到预期值,因为它使用head表中的unitsPerEm字段。
  • 作者怀疑字体数据填写错误可能与默认屏幕dpi有关,认为这是字体本身的bug。
  • 在Windows系统中安装字体后,发现其表现与引擎中的渲染相似,且在某些浏览器中选择框大小异常。
➡️

继续阅读