subtitle-burn-rendi-test · 两行 CJK 跟读框
"单行对、两行错"——找到真因了:文字锚点 vs 底块的 4px 错位
你一句话点破:单行框是对的,两行框不对。这把范围缩到一个具体的代码分叉上,
顺着查到根因——跟我之前猜的"框太矮/要加高"是两码事。
真因:两行的字走了另一条定位法,和底块差了 4px
- 底块(还有高亮 \clip):都按探针量到的墨迹坐标画——框正好套在字的真实墨迹上。
- 单行的字:走"贴底边 marginv"的静态层。探针量的就是这一层 → 框和字天生对齐。所以单行对
- 两行的字:改走
\an5\pos(行心) 逐行定位。但 \an5 居中的是字体的"行盒",不是墨迹——
CJK 的墨迹在行盒里偏下(descent 小, 字坐得低)。本地实测 fs105:墨迹比锚点低 4px(韩+4 / 日+3.5)。
- 结果:框在行心、字的墨迹低了 4px → 框偏高、字往下戳出框底。两行才暴露,因为只有两行才切到这条
\an5\pos 分支。这才是你看到的"两行错"
- 拉丁墨迹反而偏高(全大写无降部),量也小,所以拉丁不受影响。
修复前 / 后(本地真渲 = 等价 Rendi)
紫色框 · 韩 · 장비를(看框底:修复前 를 戳出来,修复后裹住)
| 行1 底块/墨迹 | 上余量 | 下余量 | 墨迹中心 vs 框中心 |
| 修复前 | 11 | 3(字戳出) | +4px(字偏下) |
| 修复后 | 7 | 6 | +0.5px(基本居中) |
紫色/蓝绿这种带底块的预设才看得到错位(黄字描边 yellow_outline 没有底块,只是整行上移 4px,无感)。
怎么修:让 \an5\pos 的字把墨迹落回行心
- 不动底块、不动 \clip(它们按探针坐标是对的)、不动单行(它本来就对)。
- 只把每个
\an5\pos 文字锚点上抬 dy,抵消"行盒中心→墨迹中心"的下沉量 → 墨迹正好落到行心(=底块所在)。
- dy 只给 CJK(韩/日/中)=
round(0.037×字号)≈4px;拉丁 dy=0,完全不变(字节一致)。
# 行盒中心对齐锚点, CJK 墨迹在行盒里偏下 ~0.037×fs → 文字锚点上抬, 落回行心
def _caption_an5_ink_dy(script, fontsize):
return round(fontsize * 0.037) if script in {"cjk","kana","hangul"} else 0
# 8 处 \an5\pos 文字发射点(底块层 + 颜色层 base/高亮 clip)统一:
\an5\pos(cx, y - _dy) # 底块/clip 坐标不动
已发 test + 测试
- skill
subtitle-burn-rendi-test v28 → v29(healthy);voiceover_align 的 test tag 已重建 snapshot 切到 v29,其余 4 个 skill 原封不动。
- 单测:新增多行 CJK 回归(文字锚点上抬 dy / 拉丁不动 / helper 值),subtitle_burn_rendi 全套 88 passed 零回归。
- 本地实测:行1 墨迹-框中心偏移 +4px → +0.5px;上/下余量 11/3 → 7/6。
👉 真机走 voiceover_align + tag:"test" 发一条两行日/韩、且用紫色或蓝绿预设,看框是不是把整字裹住了。
代码改在 repo 还没 git commit(等你真机过了再提交)。