From ade5d279a0bfad624e766219fcd170ea63e3caf2 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 13:17:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(gsub):=20emitCoverage=20format=20=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=94=B9=E7=B2=BE=E7=A1=AE=E5=AD=97=E8=8A=82=E6=AF=94?= =?UTF-8?q?=E8=BE=83=EF=BC=88=E5=8E=9F=E5=88=A4=E6=8D=AE=E8=BF=87=E5=AE=BD?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit emitCoverage 选 format1(list) vs format2(range) 的判据从 rangeCount < n 改为精确字节比较 rangeCount*6 < n*2(即 rangeCount < n/3),与 subsetGPOS emitCoverageFromGids 一致。 format1=4+n*2,format2=4+rangeCount*6。原判据 rangeCount --- backend/font_util/gsub-subset.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/font_util/gsub-subset.ts b/backend/font_util/gsub-subset.ts index 9ac1e08..89ea132 100644 --- a/backend/font_util/gsub-subset.ts +++ b/backend/font_util/gsub-subset.ts @@ -376,7 +376,11 @@ function emitCoverage(w: Writer, newGids: number[]): number { i = j + 1; } const rangeCount = rangeStarts.length; - if (rangeCount > 0 && rangeCount < n) { + /** format 选择按精确字节比较(与 subsetGPOS emitCoverageFromGids 一致): + * format1(list)=4+n*2,format2(range)=4+rangeCount*6。format2 更紧凑 ⟺ rangeCount*6 < n*2 ⟺ rangeCount < n/3。 + * 原判据 rangeCount < n 过宽:rangeCount ∈ [n/3, n)(中等长度 range,avg 1~3 gid/range)时误选 format2 致体积更大。 + * coverage 的 format1/format2 是等价表达(同一 gid 集合),选 format 不影响渲染,纯体积优化。 */ + if (rangeCount > 0 && rangeCount * 6 < n * 2) { /** format2 区间更紧凑 */ w.writeUint16(COV_RANGE); w.writeUint16(rangeCount);