private IGlyphTransformationTable ParseReverseChainingSubstitutionTable(int subTableOffset, dynamic fontTable, LookupFlags lookupFlags) { var type = typeof(GlyphTypeface).Assembly.GetType("MS.Internal.Shaping.ReverseChainingSubtable"); dynamic table = new AccessPrivateWrapper(type.Instantiate(subTableOffset)); ushort format = table.Format(fontTable.Wrapped); if (format != 1) { throw new UnknownTableFormatException(type, format); } var result = new ReverseChainingContextSubstitutionTable { Coverage = this.ParseCoverageTable(fontTable, new AccessPrivateWrapper(table.InputCoverage(fontTable.Wrapped))) }; int currentOffset = table.offset + table.offsetBacktrackGlyphCount; ushort lookbackCount = table.GlyphCount(fontTable.Wrapped, currentOffset); currentOffset += 2; result.LookbackCoverages = this.GetEnumerableFromInternalList( () => lookbackCount, i => (ICoverageTable)this.ParseCoverageTable(fontTable, new AccessPrivateWrapper(table.Coverage(fontTable.Wrapped, currentOffset))) ).ToList(); currentOffset += 2 * lookbackCount; ushort lookaheadCount = table.GlyphCount(fontTable.Wrapped, currentOffset); currentOffset += 2; result.LookaheadCoverages = this.GetEnumerableFromInternalList( () => lookaheadCount, i => (ICoverageTable)this.ParseCoverageTable(fontTable, new AccessPrivateWrapper(table.Coverage(fontTable.Wrapped, currentOffset))) ).ToList(); currentOffset += 2 * lookaheadCount; ushort glyphCount = table.GlyphCount(fontTable.Wrapped, currentOffset); currentOffset += 2; result.SubstituteGlyphIds = this.GetEnumerableFromInternalList( () => glyphCount, i => (ushort)table.Glyph(fontTable.Wrapped, currentOffset) ).ToList(); result.LookupFlags = lookupFlags; return(result); }
private IGlyphTransformationTable ParseCoverageChainingSubstitutionTable(int subTableOffset, dynamic fontTable, LookupFlags lookupFlags) { var type = typeof(GlyphTypeface).Assembly.GetType("MS.Internal.Shaping.CoverageChainingSubtable"); dynamic table = new AccessPrivateWrapper(TypeExtensions.Instantiate(type, fontTable.Wrapped, subTableOffset)); dynamic contextualLookupTable = new AccessPrivateWrapper(table.ContextualLookups(fontTable.Wrapped)); return(new ChainingCoverageContextSubstitutionTable { LookbackCoverages = this.GetEnumerableFromInternalList( () => table.BacktrackGlyphCount(fontTable.Wrapped), i => (ICoverageTable)this.ParseCoverageTable(fontTable, new AccessPrivateWrapper(table.BacktrackCoverage(fontTable.Wrapped, i)))).ToList(), ContextCoverages = this.GetEnumerableFromInternalList( () => table.InputGlyphCount(fontTable.Wrapped), i => (ICoverageTable)this.ParseCoverageTable(fontTable, new AccessPrivateWrapper(table.InputCoverage(fontTable.Wrapped, i)))).ToList(), LookaheadCoverages = this.GetEnumerableFromInternalList( () => table.LookaheadGlyphCount(fontTable.Wrapped), i => (ICoverageTable)this.ParseCoverageTable(fontTable, new AccessPrivateWrapper(table.LookaheadCoverage(fontTable.Wrapped, i)))).ToList(), TransformationSets = this.GetEnumerableFromInternalList( () => contextualLookupTable.recordCount, i => new ContextTransformationSet { FirstGlyphIndex = contextualLookupTable.SequenceIndex(fontTable.Wrapped, i), Transformations = this.GetTransformationTablesByLookupIndex(fontTable, contextualLookupTable.LookupIndex(fontTable.Wrapped, i)) }).ToList(), LookupFlags = lookupFlags }); }