mirror of
https://github.com/2234839/web-font.git
synced 2026-09-19 00:14:23 +08:00
perf(name): 合并 UTF-8+UCS-2 编码 + ASCII 快路径
name 表 size 阶段对每条记录都要 UTF-8(mac)+ UCS-2(windows)各一份, 原两次独立编码各做一遍 stringify 扫描 + 编码循环。新增 toUTF8AndUCS2Bytes 合并为单次扫描:纯 ASCII(含拒绝 \0)走超快路径——UTF-8 直接取字节、 UCS-2 大端序 [0,ch],省掉多字节分支与两次扫描;非 ASCII 回退原逻辑。 字节 sha256 完全一致(思源/令东验证),思源 8 字 woff2 端到端 -7% (name.size 占 dump 44%),令东千字文持平(name 占比 0.3% 在噪声内)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
bcd4574b3f
commit
d575d55540
6
vendor/fonteditor-core/lib/ttf/table/name.js
vendored
6
vendor/fonteditor-core/lib/ttf/table/name.js
vendored
@ -112,8 +112,10 @@ var _default = exports.default = _table.default.create('name', [], {
|
||||
var ki_name = nameKeys[ki];
|
||||
var name = ki_name;
|
||||
var id = _nameId.default.names[name];
|
||||
var utf8Bytes = _string.default.toUTF8Bytes(names[ki_name]);
|
||||
var usc2Bytes = _string.default.toUCS2Bytes(names[ki_name]);
|
||||
/** 优化320: 合并 UTF-8 + UCS-2 编码(单次扫描 + ASCII 快路径),替代两次独立编码 */
|
||||
var _pair = _string.default.toUTF8AndUCS2Bytes(names[ki_name]);
|
||||
var utf8Bytes = _pair.utf8;
|
||||
var usc2Bytes = _pair.ucs2;
|
||||
if (undefined !== id) {
|
||||
// mac
|
||||
nameRecordTbl.push({
|
||||
|
||||
35
vendor/fonteditor-core/lib/ttf/util/string.js
vendored
35
vendor/fonteditor-core/lib/ttf/util/string.js
vendored
@ -140,6 +140,41 @@ var _default = exports.default = {
|
||||
}
|
||||
return byteArr;
|
||||
},
|
||||
/**
|
||||
* 同时编码 UTF-8 与 UCS-2 字节数组(name 表专用优化)
|
||||
*
|
||||
* name 表 size 阶段对每条记录都要 UTF-8(mac 编码)+ UCS-2(windows 编码)各一份,
|
||||
* 原实现两次独立 toUTF8Bytes/toUCS2Bytes 各做一遍 stringify 扫描 + 编码循环。
|
||||
* 本函数合并为单次扫描:先判断是否纯 ASCII(含拒绝 \0),是则走超快路径——
|
||||
* UTF-8 直接取字节、UCS-2 大端序 [0, ch],省掉 UTF-8 多字节分支判断与两次扫描;
|
||||
* 非 ASCII 或含 \0 时回退原 toUTF8Bytes/toUCS2Bytes(语义完全一致)。
|
||||
* 字体 name 字段几乎都是纯 ASCII(版权/字体名/商标),实测 1.7x 加速。
|
||||
*
|
||||
* @param {string} str 字符串
|
||||
* @return {{utf8: Uint8Array, ucs2: Uint8Array}} UTF-8 与 UCS-2 字节数组
|
||||
*/
|
||||
toUTF8AndUCS2Bytes: function toUTF8AndUCS2Bytes(str) {
|
||||
var len = str.length;
|
||||
var ascii = true;
|
||||
for (var i = 0; i < len; i++) {
|
||||
var ch = str.charCodeAt(i);
|
||||
if (ch > 0x7F || ch === 0) {
|
||||
ascii = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ascii) {
|
||||
var utf8 = new Uint8Array(len);
|
||||
var ucs2 = new Uint8Array(len << 1);
|
||||
for (var i2 = 0, j = 0; i2 < len; i2++, j += 2) {
|
||||
var ch2 = str.charCodeAt(i2);
|
||||
utf8[i2] = ch2;
|
||||
ucs2[j + 1] = ch2;
|
||||
}
|
||||
return { utf8: utf8, ucs2: ucs2 };
|
||||
}
|
||||
return { utf8: this.toUTF8Bytes(str), ucs2: this.toUCS2Bytes(str) };
|
||||
},
|
||||
/**
|
||||
* 获取pascal string 字节数组
|
||||
*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user