• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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) const23 void 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) const55 void 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