UNPKG

fonteditor-core

Version:

fonts (ttf, woff, woff2, eot, svg, otf) parse, write, transform, glyph adjust.

78 lines (75 loc) 2.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = checkSum; /** * @file ttf table校验函数 * @author mengke01(kekee000@gmail.com) */ function checkSumArrayBuffer(buffer) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var length = arguments.length > 2 ? arguments[2] : undefined; length = length == null ? buffer.byteLength : length; if (offset + length > buffer.byteLength) { throw new Error('check sum out of bound'); } var nLongs = Math.floor(length / 4); var view = new DataView(buffer, offset, length); var sum = 0; var i = 0; while (i < nLongs) { sum += view.getUint32(4 * i++, false); } var leftBytes = length - nLongs * 4; if (leftBytes) { offset = nLongs * 4; while (leftBytes > 0) { sum += view.getUint8(offset, false) << leftBytes * 8; offset++; leftBytes--; } } return sum % 0x100000000; } function checkSumArray(buffer) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var length = arguments.length > 2 ? arguments[2] : undefined; length = length || buffer.length; if (offset + length > buffer.length) { throw new Error('check sum out of bound'); } var nLongs = Math.floor(length / 4); var sum = 0; var i = 0; while (i < nLongs) { sum += (buffer[i++] << 24) + (buffer[i++] << 16) + (buffer[i++] << 8) + buffer[i++]; } var leftBytes = length - nLongs * 4; if (leftBytes) { offset = nLongs * 4; while (leftBytes > 0) { sum += buffer[offset] << leftBytes * 8; offset++; leftBytes--; } } return sum % 0x100000000; } /** * table校验 * * @param {ArrayBuffer|Array} buffer 表数据 * @param {number=} offset 偏移量 * @param {number=} length 长度 * * @return {number} 校验和 */ function checkSum(buffer, offset, length) { if (buffer instanceof ArrayBuffer) { return checkSumArrayBuffer(buffer, offset, length); } else if (buffer instanceof Array) { return checkSumArray(buffer, offset, length); } throw new Error('not support checksum buffer type'); }