2 * (C) Copyright IBM Corp. and others 1998 - 2013 - All Rights Reserved
7 #include "LayoutTables.h"
8 #include "MorphTables.h"
9 #include "SubtableProcessor2.h"
10 #include "IndicRearrangementProcessor2.h"
11 #include "ContextualGlyphSubstProc2.h"
12 #include "LigatureSubstProc2.h"
13 #include "NonContextualGlyphSubstProc2.h"
14 #include "ContextualGlyphInsertionProc2.h"
15 #include "LEGlyphStorage.h"
20 void MorphTableHeader2::process(LEGlyphStorage
&glyphStorage
, le_int32 typoFlags
) const
22 const ChainHeader2
*chainHeader
= chains
;
23 le_uint32 chainCount
= SWAPL(this->nChains
);
26 for (chain
= 0; chain
< chainCount
; chain
++) {
27 FeatureFlags flag
= SWAPL(chainHeader
->defaultFlags
);
28 le_uint32 chainLength
= SWAPL(chainHeader
->chainLength
);
29 le_uint32 nFeatureEntries
= SWAPL(chainHeader
->nFeatureEntries
);
30 le_uint32 nSubtables
= SWAPL(chainHeader
->nSubtables
);
31 const MorphSubtableHeader2
*subtableHeader
=
32 (const MorphSubtableHeader2
*)&chainHeader
->featureTable
[nFeatureEntries
];
36 le_uint32 featureEntry
;
39 for (featureEntry
= 0; featureEntry
< nFeatureEntries
; featureEntry
++) {
40 FeatureTableEntry featureTableEntry
= chains
->featureTable
[featureEntry
];
41 le_int16 featureType
= SWAPW(featureTableEntry
.featureType
);
42 le_int16 featureSetting
= SWAPW(featureTableEntry
.featureSetting
);
43 le_uint32 enableFlags
= SWAPL(featureTableEntry
.enableFlags
);
44 le_uint32 disableFlags
= SWAPL(featureTableEntry
.disableFlags
);
45 switch (featureType
) {
47 if ((typoFlags
& LE_Ligatures_FEATURE_ENUM
) && (featureSetting
^ 0x1)){
51 if (((typoFlags
& LE_RLIG_FEATURE_FLAG
) && featureSetting
== requiredLigaturesOnSelector
) ||
52 ((typoFlags
& LE_CLIG_FEATURE_FLAG
) && featureSetting
== contextualLigaturesOnSelector
) ||
53 ((typoFlags
& LE_HLIG_FEATURE_FLAG
) && featureSetting
== historicalLigaturesOnSelector
) ||
54 ((typoFlags
& LE_LIGA_FEATURE_FLAG
) && featureSetting
== commonLigaturesOnSelector
)) {
61 if ((typoFlags
& LE_SMCP_FEATURE_FLAG
) && featureSetting
== smallCapsSelector
) {
66 case verticalSubstitutionType
:
68 case linguisticRearrangementType
:
70 case numberSpacingType
:
73 if ((typoFlags
& LE_SWSH_FEATURE_FLAG
) && (featureSetting
^ 0x1)){
80 case verticalPositionType
:
83 if (((typoFlags
& LE_FRAC_FEATURE_FLAG
) && featureSetting
== diagonalFractionsSelector
) ||
84 ((typoFlags
& LE_AFRC_FEATURE_FLAG
) && featureSetting
== verticalFractionsSelector
)) {
91 case typographicExtrasType
:
92 if ((typoFlags
& LE_ZERO_FEATURE_FLAG
) && featureSetting
== slashedZeroOnSelector
) {
97 case mathematicalExtrasType
:
99 case ornamentSetsType
:
101 case characterAlternativesType
:
103 case designComplexityType
:
104 if (((typoFlags
& LE_SS01_FEATURE_FLAG
) && featureSetting
== designLevel1Selector
) ||
105 ((typoFlags
& LE_SS02_FEATURE_FLAG
) && featureSetting
== designLevel2Selector
) ||
106 ((typoFlags
& LE_SS03_FEATURE_FLAG
) && featureSetting
== designLevel3Selector
) ||
107 ((typoFlags
& LE_SS04_FEATURE_FLAG
) && featureSetting
== designLevel4Selector
) ||
108 ((typoFlags
& LE_SS05_FEATURE_FLAG
) && featureSetting
== designLevel5Selector
) ||
109 ((typoFlags
& LE_SS06_FEATURE_FLAG
) && featureSetting
== designLevel6Selector
) ||
110 ((typoFlags
& LE_SS07_FEATURE_FLAG
) && featureSetting
== designLevel7Selector
)) {
112 flag
&= disableFlags
;
116 case styleOptionsType
:
118 case characterShapeType
:
122 case textSpacingType
:
124 case transliterationType
:
127 if ((typoFlags
& LE_NALT_FEATURE_FLAG
) && featureSetting
== circleAnnotationSelector
) {
128 flag
&= disableFlags
;
132 case kanaSpacingType
:
134 case ideographicSpacingType
:
137 if ((typoFlags
& LE_RUBY_FEATURE_FLAG
) && featureSetting
== rubyKanaOnSelector
) {
138 flag
&= disableFlags
;
142 case cjkRomanSpacingType
:
150 for (subtable
= 0; subtable
< nSubtables
; subtable
++) {
151 le_uint32 length
= SWAPL(subtableHeader
->length
);
152 le_uint32 coverage
= SWAPL(subtableHeader
->coverage
);
153 FeatureFlags subtableFeatures
= SWAPL(subtableHeader
->subtableFeatures
);
154 // should check coverage more carefully...
155 if (((coverage
& scfIgnoreVt2
) || !(coverage
& scfVertical2
)) && (subtableFeatures
& flag
) != 0) {
156 subtableHeader
->process(glyphStorage
);
158 subtableHeader
= (const MorphSubtableHeader2
*) ((char *)subtableHeader
+ length
);
160 chainHeader
= (const ChainHeader2
*)((char *)chainHeader
+ chainLength
);
164 void MorphSubtableHeader2::process(LEGlyphStorage
&glyphStorage
) const
166 SubtableProcessor2
*processor
= NULL
;
168 switch (SWAPL(coverage
) & scfTypeMask2
)
170 case mstIndicRearrangement
:
171 processor
= new IndicRearrangementProcessor2(this);
174 case mstContextualGlyphSubstitution
:
175 processor
= new ContextualGlyphSubstitutionProcessor2(this);
178 case mstLigatureSubstitution
:
179 processor
= new LigatureSubstitutionProcessor2(this);
182 case mstReservedUnused
:
185 case mstNonContextualGlyphSubstitution
:
186 processor
= NonContextualGlyphSubstitutionProcessor2::createInstance(this);
190 case mstContextualGlyphInsertion
:
191 processor
= new ContextualGlyphInsertionProcessor2(this);
198 if (processor
!= NULL
) {
199 processor
->process(glyphStorage
);