| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:窗口失去前台后不再每 500 毫秒整窗重绘(光标闪烁) 用户问「打开之后总是定期占用 2-3% CPU,有什么自动执行的代码么」。查下来 **没有失控的自动任务**:全仓只有一处常驻周期代码(scheduler 每 30 秒一条 due_tasks 查询,微秒级)与两处 5 分钟空闲卸载(记忆 / OCR 工作线程)。 真正在烧的是光标闪烁。gpui-base 的 BlinkCursor 每 500 毫秒翻转一次并 cx.notify(),而 GPUI 的 Window::mark_view_dirty 会把这条视图链的**所有 祖先**都标脏(gpui-pre-0.3.4/src/window.rs:2102),引擎又不复用未变子树的 预排结果,于是每一次翻转都是一次整窗重绘。上游那句注释写的是 「Blink the cursor when the window is active, pause when it's not.」,但只 实现了前半句:激活观察里没有 else 分支,on_focus 也无条件启动闪烁。而光标 只在窗口是前台时才画(InputState::show_cursor 里的 is_window_active()), 所以后台里这些重绘一张有效的像素都画不出来。 实测(隔离库 + 改名副本 + 帧探针 + typeperf,窗口全程不是前台): 无输入框有焦点 0 帧/秒;聊天输入框有焦点 2 帧/秒、2.44% 单核(主线程 2.30%); 空会话 1.22%;审计页 + 侧栏搜索框 4 帧/秒、2.24%。每次重绘 4.4–11.5 ms (空会话 4.4 / 38 条消息 11.5 / 审计页 9.8)——这就是「后台挂着不动却一直 占 2-3%」的来源。 改法(本地副本 vendor/gpui-base,第二处补丁;注释随上游用英文): 1. blink_cursor::suspend():把 epoch 推进一格(在途定时器回来时自己放弃)、 清掉 paused、保持光标可见,**不通知、不排下一次**; 2. 窗口激活观察补上「失去激活」分支(调 suspend()); 3. on_focus 只在窗口是前台时才启动闪烁(后台里收到焦点不再点火)。 验证:按同一条生产路径驱动(投递 WM_ACTIVATE(WA_INACTIVE),与用户切走窗口 时 Windows 发的是同一条消息——gpui 收到后更新 window.active 并回调激活 观察者):主线程 2.29% → 0.20%(进程 2.85% → 0.40%),投回 WA_ACTIVE 后 2.80%(光标照常闪,行为不变)。门禁:vendor_patch.rs 新增第二条检查 (the_vendored_blink_patch_is_still_applied)+ 副本自带用例 a_suspended_cursor_stops_toggling(挂起后不许再翻转;去掉补丁必红)。 文档:VENDORED.md 补「补丁二」的理由、实测表、门禁与退出条件; REQUIREMENTS.md §2.11 一行;docs/09 新增 E5/E6,把剩下的每帧成本 (状态栏每帧 3 次 fs::metadata、对话流按全部块建元素)与界面线程上 std:🧵:sleep 轮询的四处记下来。 门禁:cargo test --workspace、clippy --all-targets -D warnings、convention、 docs、vendor_patch 全绿。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 | |
修:正文「字体堆叠」——上游 gpui-base 行内排版测量用错字体,本地打补丁 用户截图里被标红、字压在一起的那几块正文,逐像素量 + 程序内日志两头对下来, 根因不在 RWork 的样式配置,而在 gpui-base 的行内排版:**测量与绘制用了不同的 字体**。 - InlineFlow 的 measured-layout 闭包是**布局阶段**才被回调的,那时元素与父元素 用 with_text_style 压进样式栈的字族已经出栈,闭包里的 window.text_style() 退回默认字体(比例字体:汉字 1.0em=15px、空格 4.28px); - 同一次绘制的 Inline 在元素树里拿到的是宿主设的 Maple Mono NF CN (汉字 1.2em=18px、空格 9px); - 于是每个含汉字的片段被少算约 18% 的宽度,**下一个片段压在上一个片段的尾部** ——正是用户看到的叠字。纯 ASCII 的行内代码片段不受影响(run 里写死了字族)。 证据(同一段文字,两条路径的字形位置与字形 id 逐字对照): 0,9.25,13.5,18,33,48… vs 0,9,18,27,45,63…,id 也完全不同;全库 1834 个片段, 含汉字的宽度比值中位数 0.822,纯 ASCII 全是 1.000。 改法:把 request_layout 那一刻的组合文字样式抓下来交给闭包(3 行)。 按「两边都要」落地: 1. 本地副本 vendor/gpui-base + 根清单的 [patch.crates-io],构建与发布自动 带修复;副本自带测试跟着门禁跑,tests/vendor_patch.rs 兜底防止更新副本时 把补丁覆盖掉; 2. UPSTREAM_REPORT.md:量化数据、影响面、复现办法与建议的 diff,可直接提上游。 修后同一段会话重扫:含汉字的比值中位数回到 1.000,测量与绘制的字形逐字一致。 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 |