V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiaoyidongxi
V2EX  ›  问与答

Chrome 把 FreeTyoe/Fontconfig 全集成进自己沙盒以及扣肉满天下简直毒瘤到爆表!

  •  1
     
  •   jiaoyidongxi · 2022-05-16 10:26:15 +08:00 · 1684 次点击
    这是一个创建于 921 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Chromium 事实上不是完全真的集成,而是套两个壳,依然依赖原生 FreeType 和 fontconfig 的基础库。而 FreeType 的很多特性全被它自己的 Skia 隔开失效,然后 Skia 和假 FreeType 壳之间互通…… 这点上不光 Linux 这样,全平台系统都这样。这也是为什么 macOS 上的 Chromium* 字体渲染会比系统原生和 Firefox ,Safari 要不一样——渲染上会淡很多,因为 Skia 把 CoreText 里涉及预设 smoothing 渲染那块全隔开,用一种自己的逻辑去重新实现(虽然 smoothing 三档命令依然对其有效,但效果和原生明显区别)。

    但更要命的是它在 Linux 上还集成进了 fontconfig 壳,导致直接不卵你系统自己的 fontconfig 任何字体规则…… Freetype/fontconfig 在一次大更后都将 autohint 作为全局默认。而 Chromium 一集成后,auothint 就变成任何扣肉系的处女铁锁了,再也解不开…… 甚至在 Android 系统上都如此。

    我当时不死心,想窥探它对系统底层库依赖的逻辑到底是怎样的。我把 FreeType 源码里涉及 CJK 的 autohint 代码全删掉,CJK 的 autohint 彻底失效。但在 Chromium 上,除非你字体全局设置 CJK 是第一位,或网页排版的编码默认是 CJK 第一排,只要是 Latin 在前通过 fallback 到 CJK ,CJK 字体依然给你 autohint…… 我彻底傻眼了…… 再也不想碰任何扣肉了……

    可怎么可能,现在的扣肉真是做到了你不关心扣肉,扣肉也会处处来关心你,塞你一嘴…… 任何多平台都会自觉的塞个 Electron 强奸你…… 就连 Qt 的 QtWebEngine 都是纯而又纯的扣肉了…… 真不知道以后还会集成什么,Firefox 是否也会步后尘……
    3 条回复    2022-05-16 23:14:29 +08:00
    kkocdko
        1
    kkocdko  
       2022-05-16 11:25:15 +08:00 via Android
    Chrome 的架构确实很烦人,总是过度封装。Firefox 的架构就清晰很多。
    Coelacanthus
        2
    Coelacanthus  
       2022-05-16 20:25:12 +08:00   ❤️ 2
    事实上不只是 autohint ,不知道是因为封装的原因还是 Chromium 对 fontconfig 的使用有问题,Chromium 的字体选择几乎不遵守你的 fontconfig 设置,导致会出现代码块字体在 Firefox 上正常但是在 Chromium 上变成非等宽字体的情况,而且这个问题存在了很多年,Google 看起来也不打算修了[1]
    相反,Firefox 没有这个问题,并且 Firefox 对相关问题修复态度非常积极,我报了两个相关的 bug ,其中一个尽管是我的配置有问题,维护者依然修复了显露出来的问题,而不是 notfirefoxbug 关闭了事[2],另一个维护者积极接受了相关修复[3]
    而且我读了相关代码,Firefox 的字体部分仅仅是封装了平台 API 到一个一致的 API ,没有动具体怎么处理[4]
    此外既然也提到了 Qt ,Qt 的字体相关代码实现也不好,一是对 fallback 字体数量做了硬编码,也即 QTBUG-80434[5],fallback 的时候最多使用 255 个字体,如果你安装了超过这个数目的字体,就有可能有字符 fallback 不到有这个字符的字体,二是 font feature 的支持非常差,现有代码是采取的硬编码方案[6],而 Firefox 和 Pango ( GTK 在用)则是采用的变长线性表储存[7],且支持从 fontconfig 配置中读取 font feature 配置(当然,Firefox 也支持从 CSS 读取)[8][9],而 Qt 的 feature request 开了三年了[10],没人管

    相关链接:
    [1]: https://catcat.cc/post/2020-10-31/#chrome
    [2]: https://bugzilla.mozilla.org/show_bug.cgi?id=1756400
    [3]: https://bugzilla.mozilla.org/show_bug.cgi?id=1744765
    [4]: https://github.com/mozilla/gecko-dev/tree/master/gfx/thebes
    [5]: https://bugreports.qt.io/browse/QTBUG-80434
    [6]: https://github.com/qt/qtbase/blob/a1fb3971f222afa01583e41f4d8f0e037d2c7892/src/gui/text/qtextengine.cpp#L1687-L1705
    [7]: https://github.com/mozilla/gecko-dev/blob/a3ee6a0ee95a1095ce496b5adc07738a7eddc7c0/gfx/thebes/gfxFontEntry.h#L496
    [8]: https://github.com/mozilla/gecko-dev/blob/a3ee6a0ee95a1095ce496b5adc07738a7eddc7c0/gfx/thebes/gfxFcPlatformFontList.cpp#L258
    [9]: https://gitlab.gnome.org/GNOME/pango/-/blob/a553ba64c43c13e37d54f1fb20a656ffb2ef067/pango/pangofc-font.c#L860
    [10]: https://bugreports.qt.io/browse/QTBUG-78645
    nullizer
        3
    nullizer  
       2022-05-16 23:14:29 +08:00
    这就是我坚持 Firefox 的原因。而且 Chromium 在 Linux 上不支持鼠标中键自动滚动的 BUG Google 也不愿意修,非常膈应人。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   969 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 20:12 · PVG 04:12 · LAX 12:12 · JFK 15:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.