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
23U_NAMESPACE_BEGIN
24
25struct SubstitutionLookupRecord
26{
27    le_uint16  sequenceIndex;
28    le_uint16  lookupListIndex;
29};
30
31struct 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
55struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
56{
57    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
58};
59
60struct 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};
67LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
68
69
70struct SubRuleSetTable
71{
72    le_uint16  subRuleCount;
73    Offset  subRuleTableOffsetArray[ANY_NUMBER];
74
75};
76LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)
77
78// NOTE: Multiple variable size arrays!!
79struct SubRuleTable
80{
81    le_uint16  glyphCount;
82    le_uint16  substCount;
83    TTGlyphID inputGlyphArray[ANY_NUMBER];
84  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
85};
86LE_VAR_ARRAY(SubRuleTable, inputGlyphArray)
87
88struct 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};
96LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
97
98
99struct SubClassSetTable
100{
101    le_uint16  subClassRuleCount;
102    Offset  subClassRuleTableOffsetArray[ANY_NUMBER];
103};
104LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)
105
106
107// NOTE: Multiple variable size arrays!!
108struct SubClassRuleTable
109{
110    le_uint16  glyphCount;
111    le_uint16  substCount;
112    le_uint16  classArray[ANY_NUMBER];
113  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
114};
115LE_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!!
122struct 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};
132LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
133
134struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
135{
136    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
137};
138
139struct 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};
146LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
147
148
149struct ChainSubRuleSetTable
150{
151    le_uint16  chainSubRuleCount;
152    Offset  chainSubRuleTableOffsetArray[ANY_NUMBER];
153
154};
155LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)
156
157// NOTE: Multiple variable size arrays!!
158struct 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};
169LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)
170
171struct 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};
181LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
182
183struct ChainSubClassSetTable
184{
185    le_uint16  chainSubClassRuleCount;
186    Offset  chainSubClassRuleTableOffsetArray[ANY_NUMBER];
187};
188LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)
189
190
191// NOTE: Multiple variable size arrays!!
192struct 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};
203LE_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!!
209struct 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};
223LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
224
225
226U_NAMESPACE_END
227#endif
228