#292·pretext

Emoji宽度校正不会在网络工人内部运行

作者: chenglou创建于 2026年9月15日更新于 2026年9月15日

在 macOS 上,Chrome 和 Firefox 的 canvas `measureText()` 会报告 Apple Color Emoji 的宽度比页面在小字体大小下绘制的宽度更大(参见 PLATFORM_BUGS.md)。在 `getEmojiCorrection()` 中,Pretext 会针对每个字体解决这个问题(源代码为 src/measurement.ts): 它在 canvas 上进行测量,如果看起来太宽,则在 `document.body` 中测量一个隐藏的跨度,并为每个 emoji 减去差值。Web Worker 没有 `document`,因此修正值在其中默默地保持为 0。在工作中准备的带有 emoji 的文本将会比页面绘制的宽度更大,因此工作计算高度时可能会计算出更多的行数,而主线程则只会绘制这些行数。如果不进行修正,我们的精度将从 7680/7680 下降到 Chrome 中的 7660 和 Firefox 中的 7652。我还没有检查工作中 OffscreenCanvas 是否会报告与页面 canvas 相同的 emoji 宽度,但我预计会如此。这个问题在思考如何在工作中布局一个非常长的聊天时出现。一个解决方案是让页面读取某个字体的修正值,并将其传递给工作。相关内容: #34,以及 ENGINE_FOLLOWUPS.md 中的说明,其中指出没有 canvas 会跟随工作的 `lang`。

内容来源: chenglou/pretext