UNPKG

fonteditor-core

Version:

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

68 lines (56 loc) 2.01 kB
/** * @file loca表 * @author mengke01(kekee000@gmail.com) */ import table from './table'; import struct from './struct'; export default table.create( 'loca', [], { read(reader, ttf) { let offset = this.offset; const indexToLocFormat = ttf.head.indexToLocFormat; // indexToLocFormat有2字节和4字节的区别 const type = struct.names[(indexToLocFormat === 0) ? struct.Uint16 : struct.Uint32]; const size = (indexToLocFormat === 0) ? 2 : 4; // 字节大小 const sizeRatio = (indexToLocFormat === 0) ? 2 : 1; // 真实地址偏移 const wordOffset = []; reader.seek(offset); const numGlyphs = ttf.maxp.numGlyphs; for (let i = 0; i < numGlyphs; ++i) { wordOffset.push(reader.read(type, offset, false) * sizeRatio); offset += size; } return wordOffset; }, write(writer, ttf) { const glyfSupport = ttf.support.glyf; let offset = ttf.support.glyf.offset || 0; const indexToLocFormat = ttf.head.indexToLocFormat; const sizeRatio = (indexToLocFormat === 0) ? 0.5 : 1; const numGlyphs = ttf.glyf.length; for (let i = 0; i < numGlyphs; ++i) { if (indexToLocFormat) { writer.writeUint32(offset); } else { writer.writeUint16(offset); } offset += glyfSupport[i].size * sizeRatio; } // write extra if (indexToLocFormat) { writer.writeUint32(offset); } else { writer.writeUint16(offset); } return writer; }, size(ttf) { const locaCount = ttf.glyf.length + 1; return ttf.head.indexToLocFormat ? locaCount * 4 : locaCount * 2; } } );