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