1 /* 2 * %W% %W% 3 * 4 * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved 5 * 6 */ 7 8 9 #include "LETypes.h" 10 #include "LayoutTables.h" 11 #include "MorphTables.h" 12 #include "SubtableProcessor.h" 13 #include "IndicRearrangementProcessor.h" 14 #include "ContextualGlyphSubstProc.h" 15 #include "LigatureSubstProc.h" 16 #include "NonContextualGlyphSubstProc.h" 17 //#include "ContextualGlyphInsertionProcessor.h" 18 #include "LEGlyphStorage.h" 19 #include "LESwaps.h" 20 21 U_NAMESPACE_BEGIN 22 process(LEGlyphStorage & glyphStorage) const23void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const 24 { 25 const ChainHeader *chainHeader = chains; 26 le_uint32 chainCount = SWAPL(this->nChains); 27 le_uint32 chain; 28 29 for (chain = 0; chain < chainCount; chain += 1) { 30 FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags); 31 le_uint32 chainLength = SWAPL(chainHeader->chainLength); 32 le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries); 33 le_int16 nSubtables = SWAPW(chainHeader->nSubtables); 34 const MorphSubtableHeader *subtableHeader = 35 (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries]; 36 le_int16 subtable; 37 38 for (subtable = 0; subtable < nSubtables; subtable += 1) { 39 le_int16 length = SWAPW(subtableHeader->length); 40 SubtableCoverage coverage = SWAPW(subtableHeader->coverage); 41 FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); 42 43 // should check coverage more carefully... 44 if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) { 45 subtableHeader->process(glyphStorage); 46 } 47 48 subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length); 49 } 50 51 chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength); 52 } 53 } 54 process(LEGlyphStorage & glyphStorage) const55void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const 56 { 57 SubtableProcessor *processor = NULL; 58 59 switch (SWAPW(coverage) & scfTypeMask) 60 { 61 case mstIndicRearrangement: 62 processor = new IndicRearrangementProcessor(this); 63 break; 64 65 case mstContextualGlyphSubstitution: 66 processor = new ContextualGlyphSubstitutionProcessor(this); 67 break; 68 69 case mstLigatureSubstitution: 70 processor = new LigatureSubstitutionProcessor(this); 71 break; 72 73 case mstReservedUnused: 74 break; 75 76 case mstNonContextualGlyphSubstitution: 77 processor = NonContextualGlyphSubstitutionProcessor::createInstance(this); 78 break; 79 80 /* 81 case mstContextualGlyphInsertion: 82 processor = new ContextualGlyphInsertionProcessor(this); 83 break; 84 */ 85 86 default: 87 break; 88 } 89 90 if (processor != NULL) { 91 processor->process(glyphStorage); 92 delete processor; 93 } 94 } 95 96 U_NAMESPACE_END 97