Пример #1
0
            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));
            }
Пример #2
0
 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;
 }
Пример #3
0
            /// <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);
                }
            }