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