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));
        }
Example #2
0
 public LookupResult(LookupSubTable foundOnTable, int foundAtIndex)
 {
     this.foundAtIndex = foundAtIndex;
     this.foundOnTable = foundOnTable;
 }