diff options
Diffstat (limited to 'Build/source/libs/icu/icu-4.8.1/layout/MorphTables.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-4.8.1/layout/MorphTables.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.8.1/layout/MorphTables.cpp b/Build/source/libs/icu/icu-4.8.1/layout/MorphTables.cpp new file mode 100644 index 00000000000..9272cc3af3b --- /dev/null +++ b/Build/source/libs/icu/icu-4.8.1/layout/MorphTables.cpp @@ -0,0 +1,96 @@ +/* + * %W% %W% + * + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved + * + */ + + +#include "LETypes.h" +#include "LayoutTables.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "IndicRearrangementProcessor.h" +#include "ContextualGlyphSubstProc.h" +#include "LigatureSubstProc.h" +#include "NonContextualGlyphSubstProc.h" +//#include "ContextualGlyphInsertionProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const +{ + const ChainHeader *chainHeader = chains; + le_uint32 chainCount = SWAPL(this->nChains); + le_uint32 chain; + + for (chain = 0; chain < chainCount; chain += 1) { + FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags); + le_uint32 chainLength = SWAPL(chainHeader->chainLength); + le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries); + le_int16 nSubtables = SWAPW(chainHeader->nSubtables); + const MorphSubtableHeader *subtableHeader = + (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries]; + le_int16 subtable; + + for (subtable = 0; subtable < nSubtables; subtable += 1) { + le_int16 length = SWAPW(subtableHeader->length); + SubtableCoverage coverage = SWAPW(subtableHeader->coverage); + FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); + + // should check coverage more carefully... + if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) { + subtableHeader->process(glyphStorage); + } + + subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length); + } + + chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength); + } +} + +void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const +{ + SubtableProcessor *processor = NULL; + + switch (SWAPW(coverage) & scfTypeMask) + { + case mstIndicRearrangement: + processor = new IndicRearrangementProcessor(this); + break; + + case mstContextualGlyphSubstitution: + processor = new ContextualGlyphSubstitutionProcessor(this); + break; + + case mstLigatureSubstitution: + processor = new LigatureSubstitutionProcessor(this); + break; + + case mstReservedUnused: + break; + + case mstNonContextualGlyphSubstitution: + processor = NonContextualGlyphSubstitutionProcessor::createInstance(this); + break; + + /* + case mstContextualGlyphInsertion: + processor = new ContextualGlyphInsertionProcessor(this); + break; + */ + + default: + break; + } + + if (processor != NULL) { + processor->process(glyphStorage); + delete processor; + } +} + +U_NAMESPACE_END |