1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
|
/*
* @(#)ContextualSubstSubtables.h 1.7 00/03/15
*
* (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved
*
*/
#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H
#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H
#include "LETypes.h"
#include "LEFontInstance.h"
#include "OpenTypeTables.h"
#include "GlyphSubstitutionTables.h"
#include "GlyphIterator.h"
#include "LookupProcessor.h"
U_NAMESPACE_BEGIN
struct SubstitutionLookupRecord
{
le_uint16 sequenceIndex;
le_uint16 lookupListIndex;
};
struct ContextualSubstitutionBase : GlyphSubstitutionSubtable
{
static le_bool matchGlyphIDs(
const LEGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator);
static le_bool matchGlyphClasses(
const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
const ClassDefinitionTable *classDefinitionTable);
static le_bool matchGlyphCoverages(
const Offset *coverageTableOffsetArray, le_uint16 glyphCount,
GlyphIterator *glyphIterator, const char *offsetBase);
static void applySubstitutionLookups(
const LookupProcessor *lookupProcessor,
const SubstitutionLookupRecord *substLookupRecordArray,
le_uint16 substCount,
GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance,
le_int32 position);
};
struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
{
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
};
struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
{
le_uint16 subRuleSetCount;
Offset subRuleSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
};
struct SubRuleSetTable
{
le_uint16 subRuleCount;
Offset subRuleTableOffsetArray[ANY_NUMBER];
};
// NOTE: Multiple variable size arrays!!
struct SubRuleTable
{
le_uint16 glyphCount;
le_uint16 substCount;
LEGlyphID inputGlyphArray[ANY_NUMBER];
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
};
struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
{
Offset classDefTableOffset;
le_uint16 subClassSetCount;
Offset subClassSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
};
struct SubClassSetTable
{
le_uint16 subClassRuleCount;
Offset subClassRuleTableOffsetArray[ANY_NUMBER];
};
// NOTE: Multiple variable size arrays!!
struct SubClassRuleTable
{
le_uint16 glyphCount;
le_uint16 substCount;
le_uint16 classArray[ANY_NUMBER];
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
};
// 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) const;
};
struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
{
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
};
struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
{
le_uint16 chainSubRuleSetCount;
Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const;
};
struct ChainSubRuleSetTable
{
le_uint16 chainSubRuleCount;
Offset chainSubRuleTableOffsetArray[ANY_NUMBER];
};
// NOTE: Multiple variable size arrays!!
struct ChainSubRuleTable
{
le_uint16 backtrackGlyphCount;
LEGlyphID backtrackGlyphArray[ANY_NUMBER];
//le_uint16 inputGlyphCount;
//LEGlyphID inputGlyphArray[ANY_NUMBER];
//le_uint16 lookaheadGlyphCount;
//LEGlyphID lookaheadGlyphArray[ANY_NUMBER];
//le_uint16 substCount;
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
};
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) const;
};
struct ChainSubClassSetTable
{
le_uint16 chainSubClassRuleCount;
Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER];
};
// 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];
};
// 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) const;
};
U_NAMESPACE_END
#endif
|