• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * (C) Copyright IBM Corp. 1998-2004 - 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 };
52 
53 struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
54 {
55     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
56 };
57 
58 struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
59 {
60     le_uint16  subRuleSetCount;
61     Offset  subRuleSetTableOffsetArray[ANY_NUMBER];
62 
63     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
64 };
65 
66 struct SubRuleSetTable
67 {
68     le_uint16  subRuleCount;
69     Offset  subRuleTableOffsetArray[ANY_NUMBER];
70 
71 };
72 
73 // NOTE: Multiple variable size arrays!!
74 struct SubRuleTable
75 {
76     le_uint16  glyphCount;
77     le_uint16  substCount;
78     TTGlyphID inputGlyphArray[ANY_NUMBER];
79   //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
80 };
81 
82 struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
83 {
84     Offset  classDefTableOffset;
85     le_uint16  subClassSetCount;
86     Offset  subClassSetTableOffsetArray[ANY_NUMBER];
87 
88     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
89 };
90 
91 struct SubClassSetTable
92 {
93     le_uint16  subClassRuleCount;
94     Offset  subClassRuleTableOffsetArray[ANY_NUMBER];
95 };
96 
97 // NOTE: Multiple variable size arrays!!
98 struct SubClassRuleTable
99 {
100     le_uint16  glyphCount;
101     le_uint16  substCount;
102     le_uint16  classArray[ANY_NUMBER];
103   //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
104 };
105 
106 // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
107 // it has an array of coverage tables instead of a single coverage table...
108 //
109 // NOTE: Multiple variable size arrays!!
110 struct ContextualSubstitutionFormat3Subtable
111 {
112     le_uint16  substFormat;
113     le_uint16  glyphCount;
114     le_uint16  substCount;
115     Offset  coverageTableOffsetArray[ANY_NUMBER];
116   //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
117 
118     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
119 };
120 
121 struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
122 {
123     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
124 };
125 
126 struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
127 {
128     le_uint16  chainSubRuleSetCount;
129     Offset  chainSubRuleSetTableOffsetArray[ANY_NUMBER];
130 
131     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
132 };
133 
134 struct ChainSubRuleSetTable
135 {
136     le_uint16  chainSubRuleCount;
137     Offset  chainSubRuleTableOffsetArray[ANY_NUMBER];
138 
139 };
140 
141 // NOTE: Multiple variable size arrays!!
142 struct ChainSubRuleTable
143 {
144     le_uint16  backtrackGlyphCount;
145     TTGlyphID backtrackGlyphArray[ANY_NUMBER];
146   //le_uint16  inputGlyphCount;
147   //TTGlyphID inputGlyphArray[ANY_NUMBER];
148   //le_uint16  lookaheadGlyphCount;
149   //TTGlyphID lookaheadGlyphArray[ANY_NUMBER];
150   //le_uint16  substCount;
151   //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
152 };
153 
154 struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable
155 {
156     Offset  backtrackClassDefTableOffset;
157     Offset  inputClassDefTableOffset;
158     Offset  lookaheadClassDefTableOffset;
159     le_uint16  chainSubClassSetCount;
160     Offset  chainSubClassSetTableOffsetArray[ANY_NUMBER];
161 
162     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
163 };
164 
165 struct ChainSubClassSetTable
166 {
167     le_uint16  chainSubClassRuleCount;
168     Offset  chainSubClassRuleTableOffsetArray[ANY_NUMBER];
169 };
170 
171 // NOTE: Multiple variable size arrays!!
172 struct ChainSubClassRuleTable
173 {
174     le_uint16  backtrackGlyphCount;
175     le_uint16  backtrackClassArray[ANY_NUMBER];
176   //le_uint16  inputGlyphCount;
177   //le_uint16  inputClassArray[ANY_NUMBER];
178   //le_uint16  lookaheadGlyphCount;
179   //le_uint16  lookaheadClassArray[ANY_NUMBER];
180   //le_uint16  substCount;
181   //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
182 };
183 
184 // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
185 // it has arrays of coverage tables instead of a single coverage table...
186 //
187 // NOTE: Multiple variable size arrays!!
188 struct ChainingContextualSubstitutionFormat3Subtable
189 {
190     le_uint16  substFormat;
191     le_uint16  backtrackGlyphCount;
192     Offset  backtrackCoverageTableOffsetArray[ANY_NUMBER];
193   //le_uint16  inputGlyphCount;
194   //Offset  inputCoverageTableOffsetArray[ANY_NUMBER];
195   //le_uint16  lookaheadGlyphCount;
196   //le_uint16  lookaheadCoverageTableOffsetArray[ANY_NUMBER];
197   //le_uint16  substCount;
198   //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
199 
200     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
201 };
202 
203 U_NAMESPACE_END
204 #endif
205