コード例 #1
0
        private static CoverageTable GetSubtablePrincipalCoverage(
            FontTable table,
            OpenTypeTags tableTag,
            ushort lookupType,
            int subtableOffset
            )
        {
            Debug.Assert(tableTag == OpenTypeTags.GSUB || tableTag == OpenTypeTags.GPOS);

            CoverageTable coverage = CoverageTable.InvalidCoverage;

            switch (tableTag)
            {
            case OpenTypeTags.GSUB:
                if (lookupType == 7)
                {
                    ExtensionLookupTable extension =
                        new ExtensionLookupTable(subtableOffset);

                    lookupType     = extension.LookupType(table);
                    subtableOffset = extension.LookupSubtableOffset(table);
                }

                switch (lookupType)
                {
                case 1:         //SingleSubst
                    SingleSubstitutionSubtable singleSubst =
                        new SingleSubstitutionSubtable(subtableOffset);

                    return(singleSubst.GetPrimaryCoverage(table));

                case 2:         //MultipleSubst
                    MultipleSubstitutionSubtable multipleSub =
                        new MultipleSubstitutionSubtable(subtableOffset);
                    return(multipleSub.GetPrimaryCoverage(table));

                case 3:         //AlternateSubst
                    AlternateSubstitutionSubtable alternateSub =
                        new AlternateSubstitutionSubtable(subtableOffset);
                    return(alternateSub.GetPrimaryCoverage(table));

                case 4:         //Ligature subst
                    LigatureSubstitutionSubtable ligaSub =
                        new LigatureSubstitutionSubtable(subtableOffset);
                    return(ligaSub.GetPrimaryCoverage(table));

                case 5:         //ContextualSubst
                    ContextSubtable contextSub =
                        new ContextSubtable(subtableOffset);
                    return(contextSub.GetPrimaryCoverage(table));

                case 6:         //ChainingSubst
                    ChainingSubtable chainingSub =
                        new ChainingSubtable(subtableOffset);
                    return(chainingSub.GetPrimaryCoverage(table));

                case 7:         //Extension lookup
                    // Ext.Lookup processed earlier. It can't contain another ext.lookups in it
                    break;

                case 8:         //ReverseCahiningSubst
                    ReverseChainingSubtable reverseChainingSub =
                        new ReverseChainingSubtable(subtableOffset);
                    return(reverseChainingSub.GetPrimaryCoverage(table));
                }

                break;

            case OpenTypeTags.GPOS:
                if (lookupType == 9)
                {
                    ExtensionLookupTable extension =
                        new ExtensionLookupTable(subtableOffset);

                    lookupType     = extension.LookupType(table);
                    subtableOffset = extension.LookupSubtableOffset(table);
                }

                switch (lookupType)
                {
                case 1:         //SinglePos
                    SinglePositioningSubtable singlePos =
                        new SinglePositioningSubtable(subtableOffset);
                    return(singlePos.GetPrimaryCoverage(table));

                case 2:         //PairPos
                    PairPositioningSubtable pairPos =
                        new PairPositioningSubtable(subtableOffset);
                    return(pairPos.GetPrimaryCoverage(table));

                case 3:         // CursivePos
                    CursivePositioningSubtable cursivePos =
                        new CursivePositioningSubtable(subtableOffset);
                    return(cursivePos.GetPrimaryCoverage(table));

                case 4:         //MarkToBasePos
                    MarkToBasePositioningSubtable markToBasePos =
                        new MarkToBasePositioningSubtable(subtableOffset);
                    return(markToBasePos.GetPrimaryCoverage(table));

                case 5:         //MarkToLigaturePos
                    // Under construction
                    MarkToLigaturePositioningSubtable markToLigaPos =
                        new MarkToLigaturePositioningSubtable(subtableOffset);
                    return(markToLigaPos.GetPrimaryCoverage(table));

                case 6:         //MarkToMarkPos
                    MarkToMarkPositioningSubtable markToMarkPos =
                        new MarkToMarkPositioningSubtable(subtableOffset);
                    return(markToMarkPos.GetPrimaryCoverage(table));

                case 7:         // Contextual
                    ContextSubtable contextPos =
                        new ContextSubtable(subtableOffset);
                    return(contextPos.GetPrimaryCoverage(table));

                case 8:         // Chaining
                    ChainingSubtable chainingPos =
                        new ChainingSubtable(subtableOffset);
                    return(chainingPos.GetPrimaryCoverage(table));

                case 9:         //Extension lookup
                    // Ext.Lookup processed earlier. It can't contain another ext.lookups in it
                    break;
                }

                break;
            }

            return(CoverageTable.InvalidCoverage);
        }