// The `GDEF` table contains various glyph properties // https://docs.microsoft.com/en-us/typography/opentype/spec/gdef import check from '../check'; import { Parser } from '../parse'; var attachList = function() { return { coverage: this.parsePointer(Parser.coverage), attachPoints: this.parseList(Parser.pointer(Parser.uShortList)) }; }; var caretValue = function() { var format = this.parseUShort(); check.argument(format === 1 || format === 2 || format === 3, 'Unsupported CaretValue table version.'); if (format === 1) { return { coordinate: this.parseShort() }; } else if (format === 2) { return { pointindex: this.parseShort() }; } else if (format === 3) { // Device / Variation Index tables unsupported return { coordinate: this.parseShort() }; } }; var ligGlyph = function() { return this.parseList(Parser.pointer(caretValue)); }; var ligCaretList = function() { return { coverage: this.parsePointer(Parser.coverage), ligGlyphs: this.parseList(Parser.pointer(ligGlyph)) }; }; var markGlyphSets = function() { this.parseUShort(); // Version return this.parseList(Parser.pointer(Parser.coverage)); }; function parseGDEFTable(data, start) { start = start || 0; const p = new Parser(data, start); const tableVersion = p.parseVersion(1); check.argument(tableVersion === 1 || tableVersion === 1.2 || tableVersion === 1.3, 'Unsupported GDEF table version.'); var gdef = { version: tableVersion, classDef: p.parsePointer(Parser.classDef), attachList: p.parsePointer(attachList), ligCaretList: p.parsePointer(ligCaretList), markAttachClassDef: p.parsePointer(Parser.classDef) }; if (tableVersion >= 1.2) { gdef.markGlyphSets = p.parsePointer(markGlyphSets); } return gdef; } export default { parse: parseGDEFTable };