sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H sl@0: #define __CONTEXTUALSUBSTITUTIONSUBTABLES_H sl@0: sl@0: /** sl@0: * \file sl@0: * \internal sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "LEFontInstance.h" sl@0: #include "OpenTypeTables.h" sl@0: #include "GlyphSubstitutionTables.h" sl@0: #include "GlyphIterator.h" sl@0: #include "LookupProcessor.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: struct SubstitutionLookupRecord sl@0: { sl@0: le_uint16 sequenceIndex; sl@0: le_uint16 lookupListIndex; sl@0: }; sl@0: sl@0: struct ContextualSubstitutionBase : GlyphSubstitutionSubtable sl@0: { sl@0: static le_bool matchGlyphIDs( sl@0: const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, sl@0: le_bool backtrack = FALSE); sl@0: sl@0: static le_bool matchGlyphClasses( sl@0: const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, sl@0: const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE); sl@0: sl@0: static le_bool matchGlyphCoverages( sl@0: const Offset *coverageTableOffsetArray, le_uint16 glyphCount, sl@0: GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE); sl@0: sl@0: static void applySubstitutionLookups( sl@0: const LookupProcessor *lookupProcessor, sl@0: const SubstitutionLookupRecord *substLookupRecordArray, sl@0: le_uint16 substCount, sl@0: GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, sl@0: le_int32 position, sl@0: LEErrorCode& success); sl@0: }; sl@0: sl@0: struct ContextualSubstitutionSubtable : ContextualSubstitutionBase sl@0: { sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable sl@0: { sl@0: le_uint16 subRuleSetCount; sl@0: Offset subRuleSetTableOffsetArray[ANY_NUMBER]; sl@0: sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct SubRuleSetTable sl@0: { sl@0: le_uint16 subRuleCount; sl@0: Offset subRuleTableOffsetArray[ANY_NUMBER]; sl@0: sl@0: }; sl@0: sl@0: // NOTE: Multiple variable size arrays!! sl@0: struct SubRuleTable sl@0: { sl@0: le_uint16 glyphCount; sl@0: le_uint16 substCount; sl@0: TTGlyphID inputGlyphArray[ANY_NUMBER]; sl@0: //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; sl@0: }; sl@0: sl@0: struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable sl@0: { sl@0: Offset classDefTableOffset; sl@0: le_uint16 subClassSetCount; sl@0: Offset subClassSetTableOffsetArray[ANY_NUMBER]; sl@0: sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct SubClassSetTable sl@0: { sl@0: le_uint16 subClassRuleCount; sl@0: Offset subClassRuleTableOffsetArray[ANY_NUMBER]; sl@0: }; sl@0: sl@0: // NOTE: Multiple variable size arrays!! sl@0: struct SubClassRuleTable sl@0: { sl@0: le_uint16 glyphCount; sl@0: le_uint16 substCount; sl@0: le_uint16 classArray[ANY_NUMBER]; sl@0: //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; sl@0: }; sl@0: sl@0: // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause sl@0: // it has an array of coverage tables instead of a single coverage table... sl@0: // sl@0: // NOTE: Multiple variable size arrays!! sl@0: struct ContextualSubstitutionFormat3Subtable sl@0: { sl@0: le_uint16 substFormat; sl@0: le_uint16 glyphCount; sl@0: le_uint16 substCount; sl@0: Offset coverageTableOffsetArray[ANY_NUMBER]; sl@0: //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; sl@0: sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase sl@0: { sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable sl@0: { sl@0: le_uint16 chainSubRuleSetCount; sl@0: Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER]; sl@0: sl@0: le_uint32 process (const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct ChainSubRuleSetTable sl@0: { sl@0: le_uint16 chainSubRuleCount; sl@0: Offset chainSubRuleTableOffsetArray[ANY_NUMBER]; sl@0: sl@0: }; sl@0: sl@0: // NOTE: Multiple variable size arrays!! sl@0: struct ChainSubRuleTable sl@0: { sl@0: le_uint16 backtrackGlyphCount; sl@0: TTGlyphID backtrackGlyphArray[ANY_NUMBER]; sl@0: //le_uint16 inputGlyphCount; sl@0: //TTGlyphID inputGlyphArray[ANY_NUMBER]; sl@0: //le_uint16 lookaheadGlyphCount; sl@0: //TTGlyphID lookaheadGlyphArray[ANY_NUMBER]; sl@0: //le_uint16 substCount; sl@0: //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; sl@0: }; sl@0: sl@0: struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable sl@0: { sl@0: Offset backtrackClassDefTableOffset; sl@0: Offset inputClassDefTableOffset; sl@0: Offset lookaheadClassDefTableOffset; sl@0: le_uint16 chainSubClassSetCount; sl@0: Offset chainSubClassSetTableOffsetArray[ANY_NUMBER]; sl@0: sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: struct ChainSubClassSetTable sl@0: { sl@0: le_uint16 chainSubClassRuleCount; sl@0: Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER]; sl@0: }; sl@0: sl@0: // NOTE: Multiple variable size arrays!! sl@0: struct ChainSubClassRuleTable sl@0: { sl@0: le_uint16 backtrackGlyphCount; sl@0: le_uint16 backtrackClassArray[ANY_NUMBER]; sl@0: //le_uint16 inputGlyphCount; sl@0: //le_uint16 inputClassArray[ANY_NUMBER]; sl@0: //le_uint16 lookaheadGlyphCount; sl@0: //le_uint16 lookaheadClassArray[ANY_NUMBER]; sl@0: //le_uint16 substCount; sl@0: //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; sl@0: }; sl@0: sl@0: // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause sl@0: // it has arrays of coverage tables instead of a single coverage table... sl@0: // sl@0: // NOTE: Multiple variable size arrays!! sl@0: struct ChainingContextualSubstitutionFormat3Subtable sl@0: { sl@0: le_uint16 substFormat; sl@0: le_uint16 backtrackGlyphCount; sl@0: Offset backtrackCoverageTableOffsetArray[ANY_NUMBER]; sl@0: //le_uint16 inputGlyphCount; sl@0: //Offset inputCoverageTableOffsetArray[ANY_NUMBER]; sl@0: //le_uint16 lookaheadGlyphCount; sl@0: //le_uint16 lookaheadCoverageTableOffsetArray[ANY_NUMBER]; sl@0: //le_uint16 substCount; sl@0: //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; sl@0: sl@0: le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, sl@0: const LEFontInstance *fontInstance, LEErrorCode& success) const; sl@0: }; sl@0: sl@0: U_NAMESPACE_END sl@0: #endif