fix(gsub): emitCoverage format 选择改精确字节比较(原判据过宽)

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<n 在 rangeCount
∈ [n/3, n)(中等长度 range,avg 1~3 gid/range)时误选 format2 致体积更大。
coverage 的 format1/format2 是等价表达(同一 gid 集合),选 format 不影响渲染。

体积(30 用例 SSIM 全不变,总体积 -168B):
- FiraCode woff2 -64B / 初夏纯标点 -32B / otf-思源 ttf -20B。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
崮生(子虚) 2026-07-25 13:17:49 +08:00
parent 1adbf2e0d1
commit ade5d279a0

View File

@ -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*2format2(range)=4+rangeCount*6format2 rangeCount*6 < n*2 rangeCount < n/3
* rangeCount < n rangeCount [n/3, n) rangeavg 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);