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 框中心
修复前113(字戳出)+4px(字偏下)
修复后76+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 + 测试

👉 真机走 voiceover_align + tag:"test" 发一条两行日/韩、且用紫色或蓝绿预设,看框是不是把整字裹住了。 代码改在 repo 还没 git commit(等你真机过了再提交)。