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
22U_NAMESPACE_BEGIN
23
24struct SubstitutionLookupRecord
25{
26    le_uint16  sequenceIndex;
27    le_uint16  lookupListIndex;
28};
29
30struct 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
54struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
55{
56    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
57};
58
59struct 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
67struct SubRuleSetTable
68{
69    le_uint16  subRuleCount;
70    Offset  subRuleTableOffsetArray[ANY_NUMBER];
71
72};
73
74// NOTE: Multiple variable size arrays!!
75struct SubRuleTable
76{
77    le_uint16  glyphCount;
78    le_uint16  substCount;
79    TTGlyphID inputGlyphArray[ANY_NUMBER];
80  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
81};
82
83struct 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
92struct SubClassSetTable
93{
94    le_uint16  subClassRuleCount;
95    Offset  subClassRuleTableOffsetArray[ANY_NUMBER];
96};
97
98// NOTE: Multiple variable size arrays!!
99struct 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!!
111struct 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
122struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
123{
124    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
125};
126
127struct 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
135struct ChainSubRuleSetTable
136{
137    le_uint16  chainSubRuleCount;
138    Offset  chainSubRuleTableOffsetArray[ANY_NUMBER];
139
140};
141
142// NOTE: Multiple variable size arrays!!
143struct 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
155struct 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
166struct ChainSubClassSetTable
167{
168    le_uint16  chainSubClassRuleCount;
169    Offset  chainSubClassRuleTableOffsetArray[ANY_NUMBER];
170};
171
172// NOTE: Multiple variable size arrays!!
173struct 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!!
189struct 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
204U_NAMESPACE_END
205#endif
206