Example #1
0
            /// <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);
            }
Example #2
0
        /// <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);
        }
Example #3
0
        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);
         }
     }
 }
Example #5
0
 /// <exception cref="System.IO.IOException"/>
 protected internal OtfClass ReadClassDefinition(int classLocation)
 {
     return(OtfClass.Create(rf, classLocation));
 }