Initial commit: Client Doc docs Server Tools
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
export default function fixCmapTable(arrayBuffer) {
|
||||
|
||||
const font = new DataView(arrayBuffer);
|
||||
const tableCount = font.getUint16(4);
|
||||
|
||||
let cmapOffset = 0;
|
||||
let cmapLength = 0;
|
||||
let cmapCheckSumOffset = 0;
|
||||
let cmapCheckSum = 0;
|
||||
|
||||
for (let i = 0; i < tableCount; i++) {
|
||||
const tag = font.getUint32(12 + i * 16);
|
||||
|
||||
if (tag === 0x636D6170) {
|
||||
cmapCheckSumOffset = 12 + i * 16 + 4;
|
||||
cmapCheckSum = font.getUint32(cmapCheckSumOffset);
|
||||
cmapOffset = font.getUint32(12 + i * 16 + 8);
|
||||
cmapLength = font.getUint32(12 + i * 16 + 12);
|
||||
GameGlobal.manager.Logger.pluginLog(`[font]cmapCheckSubOffset [${cmapCheckSumOffset}], cmapCheckSum [${cmapCheckSum}], cmapOffset [${cmapOffset}], cmapLength [${cmapLength}]`);
|
||||
}
|
||||
}
|
||||
if (cmapOffset === 0) {
|
||||
GameGlobal.manager.Logger.pluginError('[font]not found cmap');
|
||||
return false;
|
||||
}
|
||||
|
||||
const cmap = new DataView(arrayBuffer, cmapOffset, cmapLength);
|
||||
const numTables = cmap.getUint16(2);
|
||||
let subtableOffset = 4;
|
||||
let targetSubtableOffset = 0;
|
||||
|
||||
for (let i = 0; i < numTables; i++) {
|
||||
const platformId = cmap.getUint16(subtableOffset);
|
||||
const encodingId = cmap.getUint16(subtableOffset + 2);
|
||||
|
||||
|
||||
if (platformId === 0 && encodingId === 5) {
|
||||
if (i === (numTables - 1)) {
|
||||
targetSubtableOffset = subtableOffset;
|
||||
GameGlobal.manager.Logger.pluginLog(`[font]targetSubtableOffset ${targetSubtableOffset}`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
subtableOffset += 8;
|
||||
}
|
||||
|
||||
if (targetSubtableOffset > 0) {
|
||||
|
||||
|
||||
|
||||
const newCmapView = new DataView(arrayBuffer, cmapOffset, cmapLength - 8);
|
||||
|
||||
newCmapView.setUint16(2, numTables - 1);
|
||||
let sum = 0;
|
||||
const lengthInUint32 = (newCmapView.byteLength + 3) / 4;
|
||||
for (let i = 0; i < lengthInUint32; i++) {
|
||||
sum += newCmapView.getUint32(i);
|
||||
}
|
||||
|
||||
font.setUint32(cmapCheckSumOffset, sum);
|
||||
return true;
|
||||
}
|
||||
GameGlobal.manager.Logger.pluginLog('[font]not found cmap subtable');
|
||||
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user