예제 #1
0
        public static ClassSequenceRuleTable Load(BigEndianBinaryReader reader, long offset)
        {
            // ClassSequenceRule
            // +----------------------+----------------------------------+------------------------------------------+
            // | Type                 | Name                             | Description                              |
            // +======================+==================================+==========================================+
            // | uint16               | glyphCount                       | Number of glyphs to be matched           |
            // +----------------------+----------------------------------+------------------------------------------+
            // | uint16               | seqLookupCount                   | Number of SequenceLookupRecords          |
            // +----------------------+----------------------------------+------------------------------------------+
            // | uint16               | inputSequence[glyphCount - 1]    | Sequence of classes to be matched to the |
            // |                      |                                  | input glyph sequence, beginning with the |
            // |                      |                                  | second glyph position                    |
            // +----------------------+----------------------------------+------------------------------------------+
            // | SequenceLookupRecord | seqLookupRecords[seqLookupCount] | Array of SequenceLookupRecords           |
            // +----------------------+----------------------------------+------------------------------------------+
            reader.Seek(offset, SeekOrigin.Begin);
            ushort glyphCount     = reader.ReadUInt16();
            ushort seqLookupCount = reader.ReadUInt16();

            ushort[] inputSequence = reader.ReadUInt16Array(glyphCount - 1);
            SequenceLookupRecord[] seqLookupRecords = SequenceLookupRecord.LoadArray(reader, seqLookupCount);

            return(new ClassSequenceRuleTable(inputSequence, seqLookupRecords));
        }
예제 #2
0
        internal static SequenceLookupRecord[] LoadSequenceContextFormat3(BigEndianBinaryReader reader, long offset, out CoverageTable[] coverageTables)
        {
            // https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#sequence-context-format-3-coverage-based-glyph-contexts
            // SequenceContextFormat3
            // +----------------------+----------------------------------+-------------------------------------------+
            // | Type                 | Name                             | Description                               |
            // +======================+==================================+===========================================+
            // | uint16               | format                           | Format identifier: format = 3             |
            // +----------------------+----------------------------------+-------------------------------------------+
            // | uint16               | glyphCount                       | Number of glyphs in the input sequence    |
            // +----------------------+----------------------------------+-------------------------------------------+
            // | uint16               | seqLookupCount                   | Number of SequenceLookupRecords           |
            // +----------------------+----------------------------------+-------------------------------------------+
            // | Offset16             | coverageOffsets[glyphCount]      | Array of offsets to Coverage tables, from |
            // |                      |                                  | beginning of SequenceContextFormat3       |
            // |                      |                                  | subtable                                  |
            // +----------------------+----------------------------------+-------------------------------------------+
            // | SequenceLookupRecord | seqLookupRecords[seqLookupCount] | Array of SequenceLookupRecords            |
            // +----------------------+----------------------------------+-------------------------------------------+
            ushort glyphCount     = reader.ReadUInt16();
            ushort seqLookupCount = reader.ReadUInt16();

            ushort[] coverageOffsets = reader.ReadUInt16Array(glyphCount);
            SequenceLookupRecord[] seqLookupRecords = SequenceLookupRecord.LoadArray(reader, seqLookupCount);

            coverageTables = new CoverageTable[glyphCount];
            for (int i = 0; i < coverageTables.Length; i++)
            {
                coverageTables[i] = CoverageTable.Load(reader, offset + coverageOffsets[i]);
            }

            return(seqLookupRecords);
        }
예제 #3
0
        internal static SequenceLookupRecord[] LoadChainedSequenceContextFormat3(
            BigEndianBinaryReader reader,
            long offset,
            out CoverageTable[] backtrackCoverageTables,
            out CoverageTable[] inputCoverageTables,
            out CoverageTable[] lookaheadCoverageTables)
        {
            // https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#chseqctxt3
            // ChainedSequenceContextFormat3 1
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | Type                 | Name                                          | Description                                                    |
            // +======================+===============================================+================================================================+
            // | uint16               | format                                        | Format identifier: format = 3                                  |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | uint16               | backtrackGlyphCount                           | Number of glyphs in the backtrack sequence                     |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | Offset16             | backtrackCoverageOffsets[backtrackGlyphCount] | Array of offsets to coverage tables for the backtrack sequence |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | uint16               | inputGlyphCount                               | Number of glyphs in the input sequence                         |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | Offset16             | inputCoverageOffsets[inputGlyphCount]         | Array of offsets to coverage tables for the input sequence     |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | uint16               | lookaheadGlyphCount                           | Number of glyphs in the lookahead sequence                     |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | Offset16             | lookaheadCoverageOffsets[lookaheadGlyphCount] | Array of offsets to coverage tables for the lookahead sequence |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | uint16               | seqLookupCount                                | Number of SequenceLookupRecords                                |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            // | SequenceLookupRecord | seqLookupRecords[seqLookupCount]              | Array of SequenceLookupRecords                                 |
            // +----------------------+-----------------------------------------------+----------------------------------------------------------------+
            ushort backtrackGlyphCount = reader.ReadUInt16();

            ushort[] backtrackCoverageOffsets = reader.ReadUInt16Array(backtrackGlyphCount);

            ushort inputGlyphCount = reader.ReadUInt16();

            ushort[] inputCoverageOffsets = reader.ReadUInt16Array(inputGlyphCount);

            ushort lookaheadGlyphCount = reader.ReadUInt16();

            ushort[] lookaheadCoverageOffsets = reader.ReadUInt16Array(lookaheadGlyphCount);

            ushort seqLookupCount = reader.ReadUInt16();

            SequenceLookupRecord[] seqLookupRecords = SequenceLookupRecord.LoadArray(reader, seqLookupCount);

            backtrackCoverageTables = CoverageTable.LoadArray(reader, offset, backtrackCoverageOffsets);
            inputCoverageTables     = CoverageTable.LoadArray(reader, offset, inputCoverageOffsets);
            lookaheadCoverageTables = CoverageTable.LoadArray(reader, offset, lookaheadCoverageOffsets);
            return(seqLookupRecords);
        }
예제 #4
0
        public static ChainedClassSequenceRuleTable Load(BigEndianBinaryReader reader, long offset)
        {
            // ChainedClassSequenceRule
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | Type                 | Name                                   | Description                                |
            // +======================+========================================+============================================+
            // | uint16               | backtrackGlyphCount                    | Number of glyphs in the backtrack          |
            // |                      |                                        | sequence                                   |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | uint16               | backtrackSequence[backtrackGlyphCount] | Array of backtrack-sequence classes        |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | uint16               | inputGlyphCount                        | Total number of glyphs in the input        |
            // |                      |                                        | sequence                                   |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | uint16               | inputSequence[inputGlyphCount - 1]     | Array of input sequence classes, beginning |
            // |                      |                                        | with the second glyph position             |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | uint16               | lookaheadGlyphCount                    | Number of glyphs in the lookahead          |
            // |                      |                                        | sequence                                   |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | uint16               | lookaheadSequence[lookaheadGlyphCount] | Array of lookahead-sequence classes        |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | uint16               | seqLookupCount                         | Number of SequenceLookupRecords            |
            // +----------------------+----------------------------------------+--------------------------------------------+
            // | SequenceLookupRecord | seqLookupRecords[seqLookupCount]       | Array of SequenceLookupRecords             |
            // +----------------------+----------------------------------------+--------------------------------------------+
            reader.Seek(offset, SeekOrigin.Begin);

            ushort backtrackGlyphCount = reader.ReadUInt16();

            ushort[] backtrackSequence = reader.ReadUInt16Array(backtrackGlyphCount);

            ushort inputGlyphCount = reader.ReadUInt16();

            ushort[] inputSequence = reader.ReadUInt16Array(inputGlyphCount - 1);

            ushort lookaheadGlyphCount = reader.ReadUInt16();

            ushort[] lookaheadSequence = reader.ReadUInt16Array(lookaheadGlyphCount);

            ushort seqLookupCount = reader.ReadUInt16();

            SequenceLookupRecord[] seqLookupRecords = SequenceLookupRecord.LoadArray(reader, seqLookupCount);

            return(new ChainedClassSequenceRuleTable(backtrackSequence, inputSequence, lookaheadSequence, seqLookupRecords));
        }
예제 #5
0
        public static SequenceLookupRecord[] LoadArray(BigEndianBinaryReader reader, int count)
        {
            // +--------+-----------------+---------------------------------------------------+
            // | Type   | Name            | Description                                       |
            // +========+=================+===================================================+
            // | uint16 | SequenceIndex   | Index into current glyph sequence-first glyph = 0 |
            // +--------+-----------------+---------------------------------------------------+
            // | uint16 | LookupListIndex | Lookup to apply to that position-zero-based.      |
            // +--------+-----------------+---------------------------------------------------+
            var records = new SequenceLookupRecord[count];

            for (int i = 0; i < records.Length; i++)
            {
                records[i] = new SequenceLookupRecord(reader.ReadUInt16(), reader.ReadUInt16());
            }

            return(records);
        }
예제 #6
0
        public static SequenceRuleTable Load(BigEndianBinaryReader reader, long offset)
        {
            // +----------------------+----------------------------------+---------------------------------------------------------+
            // | Type                 | Name                             | Description                                             |
            // +======================+==================================+=========================================================+
            // | uint16               | glyphCount                       | Number of glyphs in the input glyph sequence            |
            // +----------------------+----------------------------------+---------------------------------------------------------+
            // | uint16               | seqLookupCount                   | Number of SequenceLookupRecords                         |
            // +----------------------+----------------------------------+---------------------------------------------------------+
            // | uint16               | inputSequence[glyphCount - 1]    | Array of input glyph IDs—starting with the second glyph |
            // +----------------------+----------------------------------+---------------------------------------------------------+
            // | SequenceLookupRecord | seqLookupRecords[seqLookupCount] | Array of Sequence lookup records                        |
            // +----------------------+----------------------------------+---------------------------------------------------------+
            reader.Seek(offset, SeekOrigin.Begin);
            ushort glyphCount     = reader.ReadUInt16();
            ushort seqLookupCount = reader.ReadUInt16();

            ushort[] inputSequence = reader.ReadUInt16Array(glyphCount - 1);
            SequenceLookupRecord[] seqLookupRecords = SequenceLookupRecord.LoadArray(reader, seqLookupCount);

            return(new SequenceRuleTable(inputSequence, seqLookupRecords));
        }