/// <exception cref="System.IO.IOException"/> protected internal virtual void ReadFormat(int subTableLocation) { int coverage = openReader.rf.ReadUnsignedShort() + subTableLocation; int valueFormat1 = openReader.rf.ReadUnsignedShort(); int valueFormat2 = openReader.rf.ReadUnsignedShort(); int locationClass1 = openReader.rf.ReadUnsignedShort() + subTableLocation; int locationClass2 = openReader.rf.ReadUnsignedShort() + subTableLocation; int class1Count = openReader.rf.ReadUnsignedShort(); int class2Count = openReader.rf.ReadUnsignedShort(); for (int k = 0; k < class1Count; ++k) { GposLookupType2.PairValueFormat[] pairs = new GposLookupType2.PairValueFormat[class2Count]; posSubs.Put(k, pairs); for (int j = 0; j < class2Count; ++j) { GposLookupType2.PairValueFormat pair = new GposLookupType2.PairValueFormat(); pair.first = OtfReadCommon.ReadGposValueRecord(openReader, valueFormat1); pair.second = OtfReadCommon.ReadGposValueRecord(openReader, valueFormat2); pairs[j] = pair; } } coverageSet = new HashSet <int>(openReader.ReadCoverageFormat(coverage)); classDef1 = openReader.ReadClassDefinition(locationClass1); classDef2 = openReader.ReadClassDefinition(locationClass2); }
/// <exception cref="System.IO.IOException"/> protected internal override void ReadSubTableFormat2(int subTableLocation) { int coverageOffset = openReader.rf.ReadUnsignedShort(); int backtrackClassDefOffset = openReader.rf.ReadUnsignedShort(); int inputClassDefOffset = openReader.rf.ReadUnsignedShort(); int lookaheadClassDefOffset = openReader.rf.ReadUnsignedShort(); int chainSubClassSetCount = openReader.rf.ReadUnsignedShort(); int[] chainSubClassSetOffsets = openReader.ReadUShortArray(chainSubClassSetCount, subTableLocation); ICollection <int> coverageGlyphIds = new HashSet <int>(openReader.ReadCoverageFormat(subTableLocation + coverageOffset )); OtfClass backtrackClassDefinition = openReader.ReadClassDefinition(subTableLocation + backtrackClassDefOffset ); OtfClass inputClassDefinition = openReader.ReadClassDefinition(subTableLocation + inputClassDefOffset); OtfClass lookaheadClassDefinition = openReader.ReadClassDefinition(subTableLocation + lookaheadClassDefOffset ); SubTableLookup6Format2 t = new SubTableLookup6Format2(openReader, lookupFlag, coverageGlyphIds, backtrackClassDefinition , inputClassDefinition, lookaheadClassDefinition); IList <IList <ContextualSubstRule> > subClassSets = new List <IList <ContextualSubstRule> >(chainSubClassSetCount ); for (int i = 0; i < chainSubClassSetCount; ++i) { IList <ContextualSubstRule> subClassSet = null; if (chainSubClassSetOffsets[i] != 0) { openReader.rf.Seek(chainSubClassSetOffsets[i]); int chainSubClassRuleCount = openReader.rf.ReadUnsignedShort(); int[] chainSubClassRuleOffsets = openReader.ReadUShortArray(chainSubClassRuleCount, chainSubClassSetOffsets [i]); subClassSet = new List <ContextualSubstRule>(chainSubClassRuleCount); for (int j = 0; j < chainSubClassRuleCount; ++j) { SubTableLookup6Format2.SubstRuleFormat2 rule; openReader.rf.Seek(chainSubClassRuleOffsets[j]); int backtrackClassCount = openReader.rf.ReadUnsignedShort(); int[] backtrackClassIds = openReader.ReadUShortArray(backtrackClassCount); int inputClassCount = openReader.rf.ReadUnsignedShort(); int[] inputClassIds = openReader.ReadUShortArray(inputClassCount - 1); int lookAheadClassCount = openReader.rf.ReadUnsignedShort(); int[] lookAheadClassIds = openReader.ReadUShortArray(lookAheadClassCount); int substCount = openReader.rf.ReadUnsignedShort(); SubstLookupRecord[] substLookupRecords = openReader.ReadSubstLookupRecords(substCount); rule = new SubTableLookup6Format2.SubstRuleFormat2(t, backtrackClassIds, inputClassIds, lookAheadClassIds, substLookupRecords); subClassSet.Add(rule); } } subClassSets.Add(subClassSet); } t.SetSubClassSets(subClassSets); subTables.Add(t); }
protected internal virtual void ReadSubTableFormat2(int subTableLocation) { int coverageOffset = openReader.rf.ReadUnsignedShort(); int classDefOffset = openReader.rf.ReadUnsignedShort(); int posClassSetCount = openReader.rf.ReadUnsignedShort(); int[] posClassSetOffsets = openReader.ReadUShortArray(posClassSetCount, subTableLocation); ICollection <int> coverageGlyphIds = new HashSet <int>(openReader.ReadCoverageFormat(subTableLocation + coverageOffset )); OtfClass classDefinition = openReader.ReadClassDefinition(subTableLocation + classDefOffset); PosTableLookup7Format2 t = new PosTableLookup7Format2(openReader, lookupFlag, coverageGlyphIds, classDefinition ); IList <IList <ContextualPositionRule> > subClassSets = new List <IList <ContextualPositionRule> >(posClassSetCount ); for (int i = 0; i < posClassSetCount; ++i) { IList <ContextualPositionRule> subClassSet = null; if (posClassSetOffsets[i] != 0) { openReader.rf.Seek(posClassSetOffsets[i]); int posClassRuleCount = openReader.rf.ReadUnsignedShort(); int[] posClassRuleOffsets = openReader.ReadUShortArray(posClassRuleCount, posClassSetOffsets[i]); subClassSet = new List <ContextualPositionRule>(posClassRuleCount); for (int j = 0; j < posClassRuleCount; ++j) { ContextualPositionRule rule; openReader.rf.Seek(posClassRuleOffsets[j]); int glyphCount = openReader.rf.ReadUnsignedShort(); int posCount = openReader.rf.ReadUnsignedShort(); int[] inputClassIds = openReader.ReadUShortArray(glyphCount - 1); PosLookupRecord[] posLookupRecords = openReader.ReadPosLookupRecords(posCount); rule = new PosTableLookup7Format2.PosRuleFormat2(t, inputClassIds, posLookupRecords); subClassSet.Add(rule); } } subClassSets.Add(subClassSet); } t.SetPosClassSets(subClassSets); subTables.Add(t); }
/// <exception cref="System.IO.IOException"/> public virtual void ReadTable() { if (tableLocation > 0) { rf.Seek(tableLocation); rf.ReadUnsignedInt(); //version, we only support 0x00010000 int glyphClassDefOffset = rf.ReadUnsignedShort(); rf.ReadUnsignedShort(); //skip Attachment Point List Table rf.ReadUnsignedShort(); //skip Ligature Caret List Table int markAttachClassDefOffset = rf.ReadUnsignedShort(); if (glyphClassDefOffset > 0) { glyphClass = new OtfClass(rf, glyphClassDefOffset + tableLocation); } if (markAttachClassDefOffset > 0) { markAttachmentClass = new OtfClass(rf, markAttachClassDefOffset + tableLocation); } } }
/// <exception cref="System.IO.IOException"/> protected internal OtfClass ReadClassDefinition(int classLocation) { return(OtfClass.Create(rf, classLocation)); }