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