public static LookupTable Load(BigEndianBinaryReader reader, long offset) { // +----------+--------------------------------+-------------------------------------------------------------+ // | Type | Name | Description | // +==========+================================+=============================================================+ // | uint16 | lookupType | Different enumerations for GSUB and GPOS. | // +----------+--------------------------------+-------------------------------------------------------------+ // | uint16 | lookupFlag | Lookup qualifiers . | // +----------+--------------------------------+-------------------------------------------------------------+ // | uint16 | subTableCount | Number of subtables for this lookup. | // +----------+--------------------------------+-------------------------------------------------------------+ // | Offset16 | subtableOffsets[subTableCount] | Array of offsets to lookup subtables, from beginning of | // | | | Lookup table. | // +----------+--------------------------------+-------------------------------------------------------------+ // | uint16 | markFilteringSet | Index (base 0) into GDEF mark glyph sets structure. | // | | | This field is only present if the USE_MARK_FILTERING_SET | // | | | lookup flag is set. | // +----------+--------------------------------+-------------------------------------------------------------+ reader.Seek(offset, SeekOrigin.Begin); ushort lookupType = reader.ReadUInt16(); LookupFlags lookupFlags = reader.ReadUInt16 <LookupFlags>(); ushort subTableCount = reader.ReadUInt16(); using Buffer <ushort> subTableOffsetsBuffer = new(subTableCount); Span <ushort> subTableOffsets = subTableOffsetsBuffer.GetSpan(); reader.ReadUInt16Array(subTableOffsets); // The fifth bit indicates the presence of a MarkFilteringSet field in the Lookup table. ushort markFilteringSet = ((lookupFlags & LookupFlags.UseMarkFilteringSet) != 0) ? reader.ReadUInt16() : (ushort)0; var lookupSubTables = new LookupSubTable[subTableCount]; for (int i = 0; i < lookupSubTables.Length; i++) { lookupSubTables[i] = LoadLookupSubTable(lookupType, lookupFlags, reader, offset + subTableOffsets[i]); } return(new LookupTable(lookupType, lookupFlags, markFilteringSet, lookupSubTables)); }
public LookupResult(LookupSubTable foundOnTable, int foundAtIndex) { this.foundAtIndex = foundAtIndex; this.foundOnTable = foundOnTable; }