]>
Commit | Line | Data |
---|---|---|
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 | ||
23 | 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 | ||
55 | 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 |