// Copyright (c) Six Labors. // Licensed under the Six Labors Split License. using System; using System.IO; namespace SixLabors.Fonts.Tables.AdvancedTypographic { /// /// A ClassSequenceRuleSet table contains an array of ClassSequenceRule tables that define /// context rules for class-based glyph contexts in Sequence Context Format 2. /// /// internal sealed class ClassSequenceRuleSetTable { /// /// Initializes a new instance of the class. /// /// The array of class sequence rule tables. private ClassSequenceRuleSetTable(ClassSequenceRuleTable[] sequenceRuleTables) => this.SequenceRuleTables = sequenceRuleTables; /// /// Gets the array of class sequence rule tables. /// public ClassSequenceRuleTable[] SequenceRuleTables { get; } /// /// Loads the class sequence rule set table. /// /// The big endian binary reader. /// Offset from beginning of the ClassSequenceRuleSet table. /// A class sequence rule set table. public static ClassSequenceRuleSetTable Load(BigEndianBinaryReader reader, long offset) { // ClassSequenceRuleSet // +----------+----------------------------------------+---------------------------------------+ // | Type | Name | Description | // +==========+========================================+=======================================+ // | uint16 | classSeqRuleCount | Number of ClassSequenceRule tables. | // +----------+----------------------------------------+---------------------------------------+ // | Offset16 | classSeqRuleOffsets[classSeqRuleCount] | Array of offsets to ClassSequenceRule | // | | | tables, from beginning of | // | | | ClassSequenceRuleSet table. | // +----------+----------------------------------------+---------------------------------------+ reader.Seek(offset, SeekOrigin.Begin); ushort seqRuleCount = reader.ReadUInt16(); using Buffer seqRuleOffsetsBuffer = new(seqRuleCount); Span seqRuleOffsets = seqRuleOffsetsBuffer.GetSpan(); reader.ReadUInt16Array(seqRuleOffsets); var subRules = new ClassSequenceRuleTable[seqRuleCount]; for (int i = 0; i < subRules.Length; i++) { subRules[i] = ClassSequenceRuleTable.Load(reader, offset + seqRuleOffsets[i]); } return new ClassSequenceRuleSetTable(subRules); } } }