Home | History | Annotate | Download | only in layout
      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 
     23 U_NAMESPACE_BEGIN
     24 
     25 struct SubstitutionLookupRecord
     26 {
     27     le_uint16  sequenceIndex;
     28     le_uint16  lookupListIndex;
     29 };
     30 
     31 struct 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 
     55 struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
     56 {
     57     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
     58 };
     59 
     60 struct 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 };
     67 LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
     68 
     69 
     70 struct SubRuleSetTable
     71 {
     72     le_uint16  subRuleCount;
     73     Offset  subRuleTableOffsetArray[ANY_NUMBER];
     74 
     75 };
     76 LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)
     77 
     78 // NOTE: Multiple variable size arrays!!
     79 struct SubRuleTable
     80 {
     81     le_uint16  glyphCount;
     82     le_uint16  substCount;
     83     TTGlyphID inputGlyphArray[ANY_NUMBER];
     84   //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
     85 };
     86 LE_VAR_ARRAY(SubRuleTable, inputGlyphArray)
     87 
     88 struct 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 };
     96 LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
     97 
     98 
     99 struct SubClassSetTable
    100 {
    101     le_uint16  subClassRuleCount;
    102     Offset  subClassRuleTableOffsetArray[ANY_NUMBER];
    103 };
    104 LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)
    105 
    106 
    107 // NOTE: Multiple variable size arrays!!
    108 struct SubClassRuleTable
    109 {
    110     le_uint16  glyphCount;
    111     le_uint16  substCount;
    112     le_uint16  classArray[ANY_NUMBER];
    113   //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
    114 };
    115 LE_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!!
    122 struct 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 };
    132 LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
    133 
    134 struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
    135 {
    136     le_uint32  process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
    137 };
    138 
    139 struct 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 };
    146 LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
    147 
    148 
    149 struct ChainSubRuleSetTable
    150 {
    151     le_uint16  chainSubRuleCount;
    152     Offset  chainSubRuleTableOffsetArray[ANY_NUMBER];
    153 
    154 };
    155 LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)
    156 
    157 // NOTE: Multiple variable size arrays!!
    158 struct 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 };
    169 LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)
    170 
    171 struct 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 };
    181 LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
    182 
    183 struct ChainSubClassSetTable
    184 {
    185     le_uint16  chainSubClassRuleCount;
    186     Offset  chainSubClassRuleTableOffsetArray[ANY_NUMBER];
    187 };
    188 LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)
    189 
    190 
    191 // NOTE: Multiple variable size arrays!!
    192 struct 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 };
    203 LE_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!!
    209 struct 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 };
    223 LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
    224 
    225 
    226 U_NAMESPACE_END
    227 #endif
    228