1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
359d709d503bab6e2b61931737e662dd293b40578ccornelius * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \file
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \internal
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LETypes.h"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LEFontInstance.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "OpenTypeTables.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "GlyphSubstitutionTables.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "GlyphIterator.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LookupProcessor.h"
2159d709d503bab6e2b61931737e662dd293b40578ccornelius#include "LETableReference.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct SubstitutionLookupRecord
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  sequenceIndex;
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  lookupListIndex;
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ContextualSubstitutionBase : GlyphSubstitutionSubtable
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static le_bool matchGlyphIDs(
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        le_bool backtrack = FALSE);
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static le_bool matchGlyphClasses(
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE);
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static le_bool matchGlyphCoverages(
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const Offset *coverageTableOffsetArray, le_uint16 glyphCount,
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE);
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static void applySubstitutionLookups(
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const LookupProcessor *lookupProcessor,
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const SubstitutionLookupRecord *substLookupRecordArray,
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        le_uint16 substCount,
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        GlyphIterator *glyphIterator,
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const LEFontInstance *fontInstance,
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        le_int32 position,
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        LEErrorCode& success);
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ContextualSubstitutionSubtable : ContextualSubstitutionBase
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  subRuleSetCount;
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  subRuleSetTableOffsetArray[ANY_NUMBER];
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
6759d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
6859d709d503bab6e2b61931737e662dd293b40578ccornelius
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct SubRuleSetTable
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  subRuleCount;
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  subRuleTableOffsetArray[ANY_NUMBER];
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
7659d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: Multiple variable size arrays!!
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct SubRuleTable
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  glyphCount;
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  substCount;
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TTGlyphID inputGlyphArray[ANY_NUMBER];
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
8659d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(SubRuleTable, inputGlyphArray)
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  classDefTableOffset;
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  subClassSetCount;
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  subClassSetTableOffsetArray[ANY_NUMBER];
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
9659d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
9759d709d503bab6e2b61931737e662dd293b40578ccornelius
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct SubClassSetTable
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  subClassRuleCount;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  subClassRuleTableOffsetArray[ANY_NUMBER];
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
10459d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)
10559d709d503bab6e2b61931737e662dd293b40578ccornelius
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: Multiple variable size arrays!!
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct SubClassRuleTable
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  glyphCount;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  substCount;
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  classArray[ANY_NUMBER];
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
11559d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(SubClassRuleTable, classArray)
11659d709d503bab6e2b61931737e662dd293b40578ccornelius
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// it has an array of coverage tables instead of a single coverage table...
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: Multiple variable size arrays!!
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ContextualSubstitutionFormat3Subtable
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  substFormat;
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  glyphCount;
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  substCount;
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  coverageTableOffsetArray[ANY_NUMBER];
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
13259d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
13685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  chainSubRuleSetCount;
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  chainSubRuleSetTableOffsetArray[ANY_NUMBER];
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
14659d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
14759d709d503bab6e2b61931737e662dd293b40578ccornelius
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainSubRuleSetTable
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  chainSubRuleCount;
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  chainSubRuleTableOffsetArray[ANY_NUMBER];
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
15559d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: Multiple variable size arrays!!
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainSubRuleTable
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  backtrackGlyphCount;
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TTGlyphID backtrackGlyphArray[ANY_NUMBER];
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  inputGlyphCount;
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //TTGlyphID inputGlyphArray[ANY_NUMBER];
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  lookaheadGlyphCount;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //TTGlyphID lookaheadGlyphArray[ANY_NUMBER];
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  substCount;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
16959d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  backtrackClassDefTableOffset;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  inputClassDefTableOffset;
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  lookaheadClassDefTableOffset;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  chainSubClassSetCount;
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  chainSubClassSetTableOffsetArray[ANY_NUMBER];
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
18159d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainSubClassSetTable
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  chainSubClassRuleCount;
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  chainSubClassRuleTableOffsetArray[ANY_NUMBER];
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
18859d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)
18959d709d503bab6e2b61931737e662dd293b40578ccornelius
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: Multiple variable size arrays!!
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainSubClassRuleTable
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  backtrackGlyphCount;
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  backtrackClassArray[ANY_NUMBER];
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  inputGlyphCount;
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  inputClassArray[ANY_NUMBER];
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  lookaheadGlyphCount;
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  lookaheadClassArray[ANY_NUMBER];
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  substCount;
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
20359d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray)
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// it has arrays of coverage tables instead of a single coverage table...
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// NOTE: Multiple variable size arrays!!
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct ChainingContextualSubstitutionFormat3Subtable
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  substFormat;
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_uint16  backtrackGlyphCount;
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Offset  backtrackCoverageTableOffsetArray[ANY_NUMBER];
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  inputGlyphCount;
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //Offset  inputCoverageTableOffsetArray[ANY_NUMBER];
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  lookaheadGlyphCount;
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  lookaheadCoverageTableOffsetArray[ANY_NUMBER];
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //le_uint16  substCount;
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
22359d709d503bab6e2b61931737e662dd293b40578ccorneliusLE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
22459d709d503bab6e2b61931737e662dd293b40578ccornelius
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
228