]> git.saurik.com Git - apple/icu.git/blob - icuSources/layout/ContextualSubstSubtables.h
ICU-57166.0.1.tar.gz
[apple/icu.git] / icuSources / layout / ContextualSubstSubtables.h
1 /*
2 *
3 * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
4 *
5 */
6
7 #ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H
8 #define __CONTEXTUALSUBSTITUTIONSUBTABLES_H
9
10 /**
11 * \file
12 * \internal
13 */
14
15 #include "LETypes.h"
16 #include "LEFontInstance.h"
17 #include "OpenTypeTables.h"
18 #include "GlyphSubstitutionTables.h"
19 #include "GlyphIterator.h"
20 #include "LookupProcessor.h"
21 #include "LETableReference.h"
22
23 U_NAMESPACE_BEGIN
24
25 struct SubstitutionLookupRecord
26 {
27 le_uint16 sequenceIndex;
28 le_uint16 lookupListIndex;
29 };
30
31 struct ContextualSubstitutionBase : GlyphSubstitutionSubtable
32 {
33 static le_bool matchGlyphIDs(
34 const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
35 le_bool backtrack = FALSE);
36
37 static le_bool matchGlyphClasses(
38 const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
39 const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE);
40
41 static le_bool matchGlyphCoverages(
42 const Offset *coverageTableOffsetArray, le_uint16 glyphCount,
43 GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE);
44
45 static void applySubstitutionLookups(
46 const LookupProcessor *lookupProcessor,
47 const SubstitutionLookupRecord *substLookupRecordArray,
48 le_uint16 substCount,
49 GlyphIterator *glyphIterator,
50 const LEFontInstance *fontInstance,
51 le_int32 position,
52 LEErrorCode& success);
53 };
54
55 struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
56 {
57 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
58 };
59
60 struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
61 {
62 le_uint16 subRuleSetCount;
63 Offset subRuleSetTableOffsetArray[ANY_NUMBER];
64
65 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
66 };
67 LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
68
69
70 struct SubRuleSetTable
71 {
72 le_uint16 subRuleCount;
73 Offset subRuleTableOffsetArray[ANY_NUMBER];
74
75 };
76 LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)
77
78 // NOTE: Multiple variable size arrays!!
79 struct SubRuleTable
80 {
81 le_uint16 glyphCount;
82 le_uint16 substCount;
83 TTGlyphID inputGlyphArray[ANY_NUMBER];
84 //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
85 };
86 LE_VAR_ARRAY(SubRuleTable, inputGlyphArray)
87
88 struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
89 {
90 Offset classDefTableOffset;
91 le_uint16 subClassSetCount;
92 Offset subClassSetTableOffsetArray[ANY_NUMBER];
93
94 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
95 };
96 LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
97
98
99 struct SubClassSetTable
100 {
101 le_uint16 subClassRuleCount;
102 Offset subClassRuleTableOffsetArray[ANY_NUMBER];
103 };
104 LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)
105
106
107 // NOTE: Multiple variable size arrays!!
108 struct SubClassRuleTable
109 {
110 le_uint16 glyphCount;
111 le_uint16 substCount;
112 le_uint16 classArray[ANY_NUMBER];
113 //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
114 };
115 LE_VAR_ARRAY(SubClassRuleTable, classArray)
116
117
118 // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
119 // it has an array of coverage tables instead of a single coverage table...
120 //
121 // NOTE: Multiple variable size arrays!!
122 struct ContextualSubstitutionFormat3Subtable
123 {
124 le_uint16 substFormat;
125 le_uint16 glyphCount;
126 le_uint16 substCount;
127 Offset coverageTableOffsetArray[ANY_NUMBER];
128 //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
129
130 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
131 };
132 LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
133
134 struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
135 {
136 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
137 };
138
139 struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
140 {
141 le_uint16 chainSubRuleSetCount;
142 Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];
143
144 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
145 };
146 LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
147
148
149 struct ChainSubRuleSetTable
150 {
151 le_uint16 chainSubRuleCount;
152 Offset chainSubRuleTableOffsetArray[ANY_NUMBER];
153
154 };
155 LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)
156
157 // NOTE: Multiple variable size arrays!!
158 struct ChainSubRuleTable
159 {
160 le_uint16 backtrackGlyphCount;
161 TTGlyphID backtrackGlyphArray[ANY_NUMBER];
162 //le_uint16 inputGlyphCount;
163 //TTGlyphID inputGlyphArray[ANY_NUMBER];
164 //le_uint16 lookaheadGlyphCount;
165 //TTGlyphID lookaheadGlyphArray[ANY_NUMBER];
166 //le_uint16 substCount;
167 //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
168 };
169 LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)
170
171 struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable
172 {
173 Offset backtrackClassDefTableOffset;
174 Offset inputClassDefTableOffset;
175 Offset lookaheadClassDefTableOffset;
176 le_uint16 chainSubClassSetCount;
177 Offset chainSubClassSetTableOffsetArray[ANY_NUMBER];
178
179 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
180 };
181 LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
182
183 struct ChainSubClassSetTable
184 {
185 le_uint16 chainSubClassRuleCount;
186 Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER];
187 };
188 LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)
189
190
191 // NOTE: Multiple variable size arrays!!
192 struct ChainSubClassRuleTable
193 {
194 le_uint16 backtrackGlyphCount;
195 le_uint16 backtrackClassArray[ANY_NUMBER];
196 //le_uint16 inputGlyphCount;
197 //le_uint16 inputClassArray[ANY_NUMBER];
198 //le_uint16 lookaheadGlyphCount;
199 //le_uint16 lookaheadClassArray[ANY_NUMBER];
200 //le_uint16 substCount;
201 //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
202 };
203 LE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray)
204
205 // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
206 // it has arrays of coverage tables instead of a single coverage table...
207 //
208 // NOTE: Multiple variable size arrays!!
209 struct ChainingContextualSubstitutionFormat3Subtable
210 {
211 le_uint16 substFormat;
212 le_uint16 backtrackGlyphCount;
213 Offset backtrackCoverageTableOffsetArray[ANY_NUMBER];
214 //le_uint16 inputGlyphCount;
215 //Offset inputCoverageTableOffsetArray[ANY_NUMBER];
216 //le_uint16 lookaheadGlyphCount;
217 //le_uint16 lookaheadCoverageTableOffsetArray[ANY_NUMBER];
218 //le_uint16 substCount;
219 //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
220
221 le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
222 };
223 LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
224
225
226 U_NAMESPACE_END
227 #endif