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); }