import r from 'restructure'; import {BigMetrics} from './EBDT'; let SBitLineMetrics = new r.Struct({ ascender: r.int8, descender: r.int8, widthMax: r.uint8, caretSlopeNumerator: r.int8, caretSlopeDenominator: r.int8, caretOffset: r.int8, minOriginSB: r.int8, minAdvanceSB: r.int8, maxBeforeBL: r.int8, minAfterBL: r.int8, pad: new r.Reserved(r.int8, 2) }); let CodeOffsetPair = new r.Struct({ glyphCode: r.uint16, offset: r.uint16 }); let IndexSubtable = new r.VersionedStruct(r.uint16, { header: { imageFormat: r.uint16, imageDataOffset: r.uint32 }, 1: { offsetArray: new r.Array(r.uint32, t => t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1) }, 2: { imageSize: r.uint32, bigMetrics: BigMetrics }, 3: { offsetArray: new r.Array(r.uint16, t => t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1) }, 4: { numGlyphs: r.uint32, glyphArray: new r.Array(CodeOffsetPair, t => t.numGlyphs + 1) }, 5: { imageSize: r.uint32, bigMetrics: BigMetrics, numGlyphs: r.uint32, glyphCodeArray: new r.Array(r.uint16, 'numGlyphs') } }); let IndexSubtableArray = new r.Struct({ firstGlyphIndex: r.uint16, lastGlyphIndex: r.uint16, subtable: new r.Pointer(r.uint32, IndexSubtable) }); let BitmapSizeTable = new r.Struct({ indexSubTableArray: new r.Pointer(r.uint32, new r.Array(IndexSubtableArray, 1), { type: 'parent' }), indexTablesSize: r.uint32, numberOfIndexSubTables: r.uint32, colorRef: r.uint32, hori: SBitLineMetrics, vert: SBitLineMetrics, startGlyphIndex: r.uint16, endGlyphIndex: r.uint16, ppemX: r.uint8, ppemY: r.uint8, bitDepth: r.uint8, flags: new r.Bitfield(r.uint8, ['horizontal', 'vertical']) }); export default new r.Struct({ version: r.uint32, // 0x00020000 numSizes: r.uint32, sizes: new r.Array(BitmapSizeTable, 'numSizes') });