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