import r from 'restructure'; import { UnboundedArray, LookupTable, StateTable } from './aat'; let LigatureData = { action: r.uint16 }; let ContextualData = { markIndex: r.uint16, currentIndex: r.uint16 }; let InsertionData = { currentInsertIndex: r.uint16, markedInsertIndex: r.uint16 }; let SubstitutionTable = new r.Struct({ items: new UnboundedArray(new r.Pointer(r.uint32, new LookupTable)) }); let SubtableData = new r.VersionedStruct('type', { 0: { // Indic Rearrangement Subtable stateTable: new StateTable }, 1: { // Contextual Glyph Substitution Subtable stateTable: new StateTable(ContextualData), substitutionTable: new r.Pointer(r.uint32, SubstitutionTable) }, 2: { // Ligature subtable stateTable: new StateTable(LigatureData), ligatureActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint32)), components: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)), ligatureList: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)) }, 4: { // Non-contextual Glyph Substitution Subtable lookupTable: new LookupTable }, 5: { // Glyph Insertion Subtable stateTable: new StateTable(InsertionData), insertionActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)) } }); let Subtable = new r.Struct({ length: r.uint32, coverage: r.uint24, type: r.uint8, subFeatureFlags: r.uint32, table: SubtableData, padding: new r.Reserved(r.uint8, t => t.length - t._currentOffset) }); let FeatureEntry = new r.Struct({ featureType: r.uint16, featureSetting: r.uint16, enableFlags: r.uint32, disableFlags: r.uint32 }); let MorxChain = new r.Struct({ defaultFlags: r.uint32, chainLength: r.uint32, nFeatureEntries: r.uint32, nSubtables: r.uint32, features: new r.Array(FeatureEntry, 'nFeatureEntries'), subtables: new r.Array(Subtable, 'nSubtables') }); export default new r.Struct({ version: r.uint16, unused: new r.Reserved(r.uint16), nChains: r.uint32, chains: new r.Array(MorxChain, 'nChains') });