From baa3a026ed538b9d9fd4d4ad7a057126e6556032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=AE=E7=94=9F=EF=BC=88=E5=AD=90=E8=99=9A=EF=BC=89?= <2234839456@qq.com> Date: Sat, 25 Jul 2026 01:39:10 +0800 Subject: [PATCH] =?UTF-8?q?refactor(gsub):=20=E5=8E=BB=E9=99=A4=20subtable?= =?UTF-8?q?AbsPositions=20=E4=B8=AD=E9=97=B4=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化329 已用 writeInt16At 直接回填,subtableAbsPositions 数组仅为 中间存储起点供回填使用,改为直接用 w.length(allEmpty)/ before(else) 计算相对 lookupStart 偏移。纯重构,输出字节逐字节一致。 Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/font_util/gsub-subset.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/backend/font_util/gsub-subset.ts b/backend/font_util/gsub-subset.ts index a05db90..5339423 100644 --- a/backend/font_util/gsub-subset.ts +++ b/backend/font_util/gsub-subset.ts @@ -1442,7 +1442,6 @@ export function subsetGSUB( w.writeUint16(lookupFlag); w.writeUint16(lk.subtableAbsOffs.length); const lookupStart = w.length - 6; - const subtableAbsPositions: number[] = new Array(lk.subtableAbsOffs.length); /** * 优化329(与 subsetGPOS 一致):subtable 偏移槽用 writeUint16(0) 占位 + 记录 slot 起点, * 序列化后统一 writeInt16At 回填,替代 reserveOffset16 的 per-slot 闭包分配 + patch push。 @@ -1460,9 +1459,9 @@ export function subsetGSUB( * 输出与逐子表路径逐字节相同(每个子表都是 writeEmptySubtable),仅省去 N 次 * 函数调用 + 预检 + rollback 的开销。subCount 不变,lookup 仍存在。 */ for (let j = 0; j < lk.subtableAbsOffs.length; j++) { - subtableAbsPositions[j] = w.length; + /** subtable 起点(writeEmpty 前)回填到偏移槽(相对 lookupStart) */ + w.writeInt16At(subtableSlotsStart + j * 2, w.length - lookupStart); writeEmptySubtable(w, lk.effectiveType); - w.writeInt16At(subtableSlotsStart + j * 2, subtableAbsPositions[j] - lookupStart); } } else { for (let j = 0; j < lk.subtableAbsOffs.length; j++) { @@ -1476,8 +1475,7 @@ export function subsetGSUB( w.rollback(before); writeEmptySubtable(w, lk.effectiveType); } - /** 记录实际 subtable 起点(成功=before,失败回退后=before 同值)并回填偏移槽 */ - subtableAbsPositions[j] = before; + /** 回填偏移槽:subtable 起点为 before(成功=serializeSubtable 起点,失败=rollback 后空 subtable 起点,两者同值) */ w.writeInt16At(subtableSlotsStart + j * 2, before - lookupStart); } }