sl@0: /* sl@0: * %W% %W% sl@0: * sl@0: * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "LETypes.h" sl@0: #include "LayoutTables.h" sl@0: #include "MorphTables.h" sl@0: #include "SubtableProcessor.h" sl@0: #include "IndicRearrangementProcessor.h" sl@0: #include "ContextualGlyphSubstProc.h" sl@0: #include "LigatureSubstProc.h" sl@0: #include "NonContextualGlyphSubstProc.h" sl@0: //#include "ContextualGlyphInsertionProcessor.h" sl@0: #include "LEGlyphStorage.h" sl@0: #include "LESwaps.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const sl@0: { sl@0: const ChainHeader *chainHeader = chains; sl@0: le_uint32 chainCount = SWAPL(this->nChains); sl@0: le_uint32 chain; sl@0: sl@0: for (chain = 0; chain < chainCount; chain += 1) { sl@0: FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags); sl@0: le_uint32 chainLength = SWAPL(chainHeader->chainLength); sl@0: le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries); sl@0: le_int16 nSubtables = SWAPW(chainHeader->nSubtables); sl@0: const MorphSubtableHeader *subtableHeader = sl@0: (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries]; sl@0: le_int16 subtable; sl@0: sl@0: for (subtable = 0; subtable < nSubtables; subtable += 1) { sl@0: le_int16 length = SWAPW(subtableHeader->length); sl@0: SubtableCoverage coverage = SWAPW(subtableHeader->coverage); sl@0: FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); sl@0: sl@0: // should check coverage more carefully... sl@0: if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) { sl@0: subtableHeader->process(glyphStorage); sl@0: } sl@0: sl@0: subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length); sl@0: } sl@0: sl@0: chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength); sl@0: } sl@0: } sl@0: sl@0: void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const sl@0: { sl@0: SubtableProcessor *processor = NULL; sl@0: sl@0: switch (SWAPW(coverage) & scfTypeMask) sl@0: { sl@0: case mstIndicRearrangement: sl@0: processor = new IndicRearrangementProcessor(this); sl@0: break; sl@0: sl@0: case mstContextualGlyphSubstitution: sl@0: processor = new ContextualGlyphSubstitutionProcessor(this); sl@0: break; sl@0: sl@0: case mstLigatureSubstitution: sl@0: processor = new LigatureSubstitutionProcessor(this); sl@0: break; sl@0: sl@0: case mstReservedUnused: sl@0: break; sl@0: sl@0: case mstNonContextualGlyphSubstitution: sl@0: processor = NonContextualGlyphSubstitutionProcessor::createInstance(this); sl@0: break; sl@0: sl@0: /* sl@0: case mstContextualGlyphInsertion: sl@0: processor = new ContextualGlyphInsertionProcessor(this); sl@0: break; sl@0: */ sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: if (processor != NULL) { sl@0: processor->process(glyphStorage); sl@0: delete processor; sl@0: } sl@0: } sl@0: sl@0: U_NAMESPACE_END