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