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 21U_NAMESPACE_BEGIN 22 23void 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 55void 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 96U_NAMESPACE_END 97