/// <exception cref="System.IO.IOException"/>
        protected internal override void ReadSubTable(int subTableLocation)
        {
            openReader.rf.Seek(subTableLocation);
            openReader.rf.ReadUnsignedShort();
            //skip format, always 1
            int                   markCoverageLocation     = openReader.rf.ReadUnsignedShort() + subTableLocation;
            int                   ligatureCoverageLocation = openReader.rf.ReadUnsignedShort() + subTableLocation;
            int                   classCount            = openReader.rf.ReadUnsignedShort();
            int                   markArrayLocation     = openReader.rf.ReadUnsignedShort() + subTableLocation;
            int                   ligatureArrayLocation = openReader.rf.ReadUnsignedShort() + subTableLocation;
            IList <int>           markCoverage          = openReader.ReadCoverageFormat(markCoverageLocation);
            IList <int>           ligatureCoverage      = openReader.ReadCoverageFormat(ligatureCoverageLocation);
            IList <OtfMarkRecord> markRecords           = OtfReadCommon.ReadMarkArray(openReader, markArrayLocation);

            GposLookupType5.MarkToLigature markToLigature = new GposLookupType5.MarkToLigature();
            for (int k = 0; k < markCoverage.Count; ++k)
            {
                markToLigature.marks[markCoverage[k]] = markRecords[k];
            }
            IList <IList <GposAnchor[]> > ligatureArray = OtfReadCommon.ReadLigatureArray(openReader, classCount, ligatureArrayLocation
                                                                                          );

            for (int k_1 = 0; k_1 < ligatureCoverage.Count; ++k_1)
            {
                markToLigature.ligatures[ligatureCoverage[k_1]] = ligatureArray[k_1];
            }
            marksligatures.Add(markToLigature);
        }
        /// <exception cref="System.IO.IOException"/>
        protected internal override void ReadSubTable(int subTableLocation)
        {
            openReader.rf.Seek(subTableLocation);
            openReader.rf.ReadUnsignedShort();
            //skip format, always 1
            int                   markCoverageLocation = openReader.rf.ReadUnsignedShort() + subTableLocation;
            int                   baseCoverageLocation = openReader.rf.ReadUnsignedShort() + subTableLocation;
            int                   classCount           = openReader.rf.ReadUnsignedShort();
            int                   markArrayLocation    = openReader.rf.ReadUnsignedShort() + subTableLocation;
            int                   baseArrayLocation    = openReader.rf.ReadUnsignedShort() + subTableLocation;
            IList <int>           markCoverage         = openReader.ReadCoverageFormat(markCoverageLocation);
            IList <int>           baseCoverage         = openReader.ReadCoverageFormat(baseCoverageLocation);
            IList <OtfMarkRecord> markRecords          = OtfReadCommon.ReadMarkArray(openReader, markArrayLocation);

            GposLookupType4.MarkToBase markToBase = new GposLookupType4.MarkToBase();
            for (int k = 0; k < markCoverage.Count; ++k)
            {
                markToBase.marks.Put(markCoverage[k], markRecords[k]);
            }
            IList <GposAnchor[]> baseArray = OtfReadCommon.ReadBaseArray(openReader, classCount, baseArrayLocation);

            for (int k = 0; k < baseCoverage.Count; ++k)
            {
                markToBase.bases.Put(baseCoverage[k], baseArray[k]);
            }
            marksbases.Add(markToBase);
        }