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)); }
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); }
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); }
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)); }
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)); }