fontservices/textshaperplugin/IcuSource/layout/MorphTables.cpp
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontservices/textshaperplugin/IcuSource/layout/MorphTables.cpp	Tue Feb 02 02:02:46 2010 +0200
@@ -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