mirror of
https://github.com/2234839/web-font.git
synced 2026-09-07 08:12:16 +08:00
perf(gsub-reachable): collectChainRuleRefs 循环内 r.u16 改 dv.getUint16
chain format1 规则的 backtrack/input/lookahead/substRecords 读取(6 个内层 循环)从 r.u16 改 dv.getUint16。FiraCode 180 个 fmt1 规则 × 多次密集调用。 count 读取(backtrackCount 等)保留 r.u16 维持原行为。 FiraCode reachable 集合 size=89 不变,5 字体 sha 逐字节一致,SSIM 全不变。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7719110b32
commit
77029f1090
@ -543,6 +543,8 @@ function collectChainRuleRefs(
|
||||
isGidFormat: boolean,
|
||||
): void {
|
||||
/** format1/2 rule: backtrackCount + backtrack[] + inputCount + input[] + lookaheadCount + lookahead[] + substCount + substRecords[] */
|
||||
/** 缓存 dv:chain format1 规则密集调用(FiraCode 180 fmt1 规则 × 6+ 次 u16),直接 getUint16 省方法调用+边界检查 */
|
||||
const dv = r.dv;
|
||||
let p = ruleOff;
|
||||
const backtrackCount = r.u16(p); p += 2;
|
||||
const backtrackEnd = p + backtrackCount * 2;
|
||||
@ -559,26 +561,26 @@ function collectChainRuleRefs(
|
||||
/** 第一遍:校验 backtrack + input + lookahead 全部 gid 在子集(遇子集外即放弃规则) */
|
||||
let q = ruleOff + 2;
|
||||
for (let k = 0; k < backtrackCount; k++) {
|
||||
if (!inSubset(r.u16(q + k * 2))) return;
|
||||
if (!inSubset(dv.getUint16(q + k * 2, false))) return;
|
||||
}
|
||||
q += backtrackCount * 2 + 2;
|
||||
for (let k = 0; k < inputLen; k++) {
|
||||
if (!inSubset(r.u16(q + k * 2))) return;
|
||||
if (!inSubset(dv.getUint16(q + k * 2, false))) return;
|
||||
}
|
||||
q += inputLen * 2 + 2;
|
||||
for (let k = 0; k < lookaheadCount; k++) {
|
||||
if (!inSubset(r.u16(q + k * 2))) return;
|
||||
if (!inSubset(dv.getUint16(q + k * 2, false))) return;
|
||||
}
|
||||
/** 第二遍:全部在子集,收集 context gid */
|
||||
q = ruleOff + 2;
|
||||
for (let k = 0; k < backtrackCount; k++) contextGids.add(r.u16(q + k * 2));
|
||||
for (let k = 0; k < backtrackCount; k++) contextGids.add(dv.getUint16(q + k * 2, false));
|
||||
q += backtrackCount * 2 + 2;
|
||||
for (let k = 0; k < inputLen; k++) contextGids.add(r.u16(q + k * 2));
|
||||
for (let k = 0; k < inputLen; k++) contextGids.add(dv.getUint16(q + k * 2, false));
|
||||
q += inputLen * 2 + 2;
|
||||
for (let k = 0; k < lookaheadCount; k++) contextGids.add(r.u16(q + k * 2));
|
||||
for (let k = 0; k < lookaheadCount; k++) contextGids.add(dv.getUint16(q + k * 2, false));
|
||||
}
|
||||
for (let k = 0; k < substCount; k++) {
|
||||
/** SubstLookupRecord: sequenceIndex(2) + lookupListIndex(2) */
|
||||
refs.add(r.u16(p + k * 4 + 2));
|
||||
refs.add(dv.getUint16(p + k * 4 + 2, false));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user