diff --git a/src/tables/gsub.js b/src/tables/gsub.js index 3fb27276..ea38ed6b 100644 --- a/src/tables/gsub.js +++ b/src/tables/gsub.js @@ -402,6 +402,21 @@ subtableMakers[6] = function makeLookup6(subtable) { check.assert(false, 'lookup type 6 format must be 1, 2 or 3.'); }; +subtableMakers[7] = function makeLookup7(extensionSubstitutionTable) { + if (extensionSubstitutionTable.substFormat === 1) { + const extensionTable = subtableMakers[extensionSubstitutionTable.lookupType](extensionSubstitutionTable.extension); + const returnTable = new table.Table('extensionSubstitutionTable', [ + {name: 'substFormat', type: 'USHORT', value: extensionSubstitutionTable.substFormat}, + {name: 'extensionLookupType', type: 'USHORT', value: extensionSubstitutionTable.lookupType}, + {name: 'extensionOffset', type: 'ULONG', value: undefined} + ]); + returnTable.extensionTable = extensionTable; + return returnTable; + } + + check.assert(false, 'lookup type 7 format must be 1.'); +}; + function makeGsubTable(gsub) { return new table.Table('GSUB', [ {name: 'version', type: 'ULONG', value: 0x10000}, diff --git a/src/types.js b/src/types.js index 25898970..410d0443 100644 --- a/src/types.js +++ b/src/types.js @@ -945,6 +945,8 @@ encode.TABLE = function(table) { const length = (table.fields || []).length; const subtables = []; const subtableOffsets = []; + const extensionTables = []; + const extensionOffsets = []; for (let i = 0; i < length; i += 1) { const field = table.fields[i]; @@ -966,6 +968,11 @@ encode.TABLE = function(table) { subtables.push(bytes); } d.push(...[0, 0]); + subtables.push(bytes); + + if ( value.extensionTable ) { + extensionTables.push(encode.TABLE(value.extensionTable)); + } } else { for (let j = 0; j < bytes.length; j++) { d.push(bytes[j]); @@ -976,7 +983,8 @@ encode.TABLE = function(table) { for (let i = 0; i < subtables.length; i += 1) { const o = subtableOffsets[i]; const offset = d.length; - check.argument(offset < 65536, 'Table ' + table.tableName + ' too big.'); + const maxOffset = table.tableName === 'lookupListTable' ? 4294967295 : 65536; + check.argument(offset < maxOffset, 'Table ' + table.tableName + ' too big.'); d[o] = offset >> 8; d[o + 1] = offset & 0xff; for (let j = 0; j < subtables[i].length; j++) { @@ -984,6 +992,12 @@ encode.TABLE = function(table) { } } + for (let i = 0; i < extensionTables.length; i += 1) { + // TODO: calculate offset value and replace in corresponding extensionSubstitutionTable + // Is this even the right spot to append the extensions data? + d = d.concat(extensionTables[i]); + } + return d; };