public static LookupType5Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags) { // MarkLigPosFormat1 Subtable. // +--------------------+---------------------------------+------------------------------------------------------+ // | Type | Name | Description | // +====================+=================================+======================================================+ // | uint16 | posFormat | Format identifier: format = 1 | // +--------------------+---------------------------------+------------------------------------------------------+ // | Offset16 | markCoverageOffset | Offset to markCoverage table, | // | | | from beginning of MarkLigPos subtable. | // +--------------------+---------------------------------+------------------------------------------------------+ // | Offset16 | ligatureCoverageOffset | Offset to ligatureCoverage table, | // | | | from beginning of MarkLigPos subtable. | // +--------------------+---------------------------------+------------------------------------------------------+ // | uint16 | markClassCount | Number of defined mark classes | // +--------------------+---------------------------------+------------------------------------------------------+ // | Offset16 | markArrayOffset | Offset to MarkArray table, from beginning | // | | | of MarkLigPos subtable. | // +--------------------+---------------------------------+------------------------------------------------------+ // | Offset16 | ligatureArrayOffset | Offset to LigatureArray table, | // | | | from beginning of MarkLigPos subtable. | // +--------------------+---------------------------------+------------------------------------------------------+ ushort markCoverageOffset = reader.ReadOffset16(); ushort ligatureCoverageOffset = reader.ReadOffset16(); ushort markClassCount = reader.ReadUInt16(); ushort markArrayOffset = reader.ReadOffset16(); ushort ligatureArrayOffset = reader.ReadOffset16(); var markCoverage = CoverageTable.Load(reader, offset + markCoverageOffset); var ligatureCoverage = CoverageTable.Load(reader, offset + ligatureCoverageOffset); var markArrayTable = new MarkArrayTable(reader, offset + markArrayOffset); var ligatureArrayTable = new LigatureArrayTable(reader, offset + ligatureArrayOffset, markClassCount); return(new LookupType5Format1SubTable(markCoverage, ligatureCoverage, markArrayTable, ligatureArrayTable, lookupFlags)); }
public LookupType5Format1SubTable( CoverageTable markCoverage, CoverageTable ligatureCoverage, MarkArrayTable markArrayTable, LigatureArrayTable ligatureArrayTable, LookupFlags lookupFlags) : base(lookupFlags) { this.markCoverage = markCoverage; this.ligatureCoverage = ligatureCoverage; this.markArrayTable = markArrayTable; this.ligatureArrayTable = ligatureArrayTable; }
/// <summary> /// Lookup Type 5: MarkToLigature Attachment Positioning Subtable /// </summary> /// <param name="reader"></param> void ReadLookupType5(BinaryReader reader) { //USHORT PosFormat Format identifier-format = 1 //Offset MarkCoverage Offset to Mark Coverage table-from beginning of MarkLigPos subtable //Offset LigatureCoverage Offset to Ligature Coverage table-from beginning of MarkLigPos subtable //USHORT ClassCount Number of defined mark classes //Offset MarkArray Offset to MarkArray table-from beginning of MarkLigPos subtable //Offset LigatureArray Offset to LigatureArray table-from beginning of MarkLigPos subtable long thisLookupTablePos = reader.BaseStream.Position; int j = subTableOffsets.Length; for (int i = 0; i < j; ++i) { long subTableStartAt = lookupTablePos + subTableOffsets[i]; reader.BaseStream.Seek(subTableStartAt, SeekOrigin.Begin); //----------------------- ushort format = reader.ReadUInt16(); if (format != 1) { throw new NotSupportedException(); } short markCoverageOffset = reader.ReadInt16(); //from beginning of MarkLigPos subtable short ligatureCoverageOffset = reader.ReadInt16(); ushort classCount = reader.ReadUInt16(); short markArrayOffset = reader.ReadInt16(); short ligatureArrayOffset = reader.ReadInt16(); //----------------------- var subTable = new LkSubTableType5(); //----------------------- subTable.MarkCoverage = CoverageTable.CreateFrom(reader, subTableStartAt + markCoverageOffset); //----------------------- subTable.LigatureCoverage = CoverageTable.CreateFrom(reader, subTableStartAt + ligatureCoverageOffset); //----------------------- subTable.MarkArrayTable = MarkArrayTable.CreateFrom(reader, subTableStartAt + markArrayOffset); //----------------------- reader.BaseStream.Seek(subTableStartAt + ligatureArrayOffset, SeekOrigin.Begin); var ligatureArrayTable = new LigatureArrayTable(); ligatureArrayTable.ReadFrom(reader, classCount); subTable.LigatureArrayTable = ligatureArrayTable; //----------------------- this.subTables.Add(subTable); } }