3
* (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
7
#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H
8
#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H
16
#include "LEFontInstance.h"
17
#include "OpenTypeTables.h"
18
#include "GlyphSubstitutionTables.h"
19
#include "GlyphIterator.h"
20
#include "LookupProcessor.h"
24
struct SubstitutionLookupRecord
26
le_uint16 sequenceIndex;
27
le_uint16 lookupListIndex;
30
struct ContextualSubstitutionBase : GlyphSubstitutionSubtable
32
static le_bool matchGlyphIDs(
33
const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
34
le_bool backtrack = FALSE);
36
static le_bool matchGlyphClasses(
37
const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
38
const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE);
40
static le_bool matchGlyphCoverages(
41
const Offset *coverageTableOffsetArray, le_uint16 glyphCount,
42
GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE);
44
static void applySubstitutionLookups(
45
const LookupProcessor *lookupProcessor,
46
const SubstitutionLookupRecord *substLookupRecordArray,
48
GlyphIterator *glyphIterator,
49
const LEFontInstance *fontInstance,
51
LEErrorCode& success);
54
struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
56
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
59
struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
61
le_uint16 subRuleSetCount;
62
Offset subRuleSetTableOffsetArray[ANY_NUMBER];
64
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
67
struct SubRuleSetTable
69
le_uint16 subRuleCount;
70
Offset subRuleTableOffsetArray[ANY_NUMBER];
74
// NOTE: Multiple variable size arrays!!
79
TTGlyphID inputGlyphArray[ANY_NUMBER];
80
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
83
struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
85
Offset classDefTableOffset;
86
le_uint16 subClassSetCount;
87
Offset subClassSetTableOffsetArray[ANY_NUMBER];
89
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
92
struct SubClassSetTable
94
le_uint16 subClassRuleCount;
95
Offset subClassRuleTableOffsetArray[ANY_NUMBER];
98
// NOTE: Multiple variable size arrays!!
99
struct SubClassRuleTable
101
le_uint16 glyphCount;
102
le_uint16 substCount;
103
le_uint16 classArray[ANY_NUMBER];
104
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
107
// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
108
// it has an array of coverage tables instead of a single coverage table...
110
// NOTE: Multiple variable size arrays!!
111
struct ContextualSubstitutionFormat3Subtable
113
le_uint16 substFormat;
114
le_uint16 glyphCount;
115
le_uint16 substCount;
116
Offset coverageTableOffsetArray[ANY_NUMBER];
117
//SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
119
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
122
struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
124
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
127
struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
129
le_uint16 chainSubRuleSetCount;
130
Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];
132
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
135
struct ChainSubRuleSetTable
137
le_uint16 chainSubRuleCount;
138
Offset chainSubRuleTableOffsetArray[ANY_NUMBER];
142
// NOTE: Multiple variable size arrays!!
143
struct ChainSubRuleTable
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];
155
struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable
157
Offset backtrackClassDefTableOffset;
158
Offset inputClassDefTableOffset;
159
Offset lookaheadClassDefTableOffset;
160
le_uint16 chainSubClassSetCount;
161
Offset chainSubClassSetTableOffsetArray[ANY_NUMBER];
163
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
166
struct ChainSubClassSetTable
168
le_uint16 chainSubClassRuleCount;
169
Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER];
172
// NOTE: Multiple variable size arrays!!
173
struct ChainSubClassRuleTable
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];
185
// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
186
// it has arrays of coverage tables instead of a single coverage table...
188
// NOTE: Multiple variable size arrays!!
189
struct ChainingContextualSubstitutionFormat3Subtable
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];
201
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;