2000-11-28 20:56:52 +00:00
|
|
|
/*
|
|
|
|
*
|
2013-04-18 21:24:51 +00:00
|
|
|
* (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
|
2000-11-28 20:56:52 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H
|
|
|
|
#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H
|
|
|
|
|
2003-01-13 23:15:11 +00:00
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
* \internal
|
|
|
|
*/
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
#include "LETypes.h"
|
|
|
|
#include "LEFontInstance.h"
|
|
|
|
#include "OpenTypeTables.h"
|
|
|
|
#include "GlyphSubstitutionTables.h"
|
|
|
|
#include "GlyphIterator.h"
|
|
|
|
#include "LookupProcessor.h"
|
2013-04-18 21:24:51 +00:00
|
|
|
#include "LETableReference.h"
|
2000-11-28 20:56:52 +00:00
|
|
|
|
2001-10-16 00:39:01 +00:00
|
|
|
U_NAMESPACE_BEGIN
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
struct SubstitutionLookupRecord
|
|
|
|
{
|
|
|
|
le_uint16 sequenceIndex;
|
|
|
|
le_uint16 lookupListIndex;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ContextualSubstitutionBase : GlyphSubstitutionSubtable
|
|
|
|
{
|
|
|
|
static le_bool matchGlyphIDs(
|
2003-02-05 00:05:40 +00:00
|
|
|
const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
|
2003-12-08 22:43:41 +00:00
|
|
|
le_bool backtrack = FALSE);
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
static le_bool matchGlyphClasses(
|
2001-01-19 00:30:17 +00:00
|
|
|
const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
|
2003-12-08 22:43:41 +00:00
|
|
|
const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE);
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
static le_bool matchGlyphCoverages(
|
2001-01-19 00:30:17 +00:00
|
|
|
const Offset *coverageTableOffsetArray, le_uint16 glyphCount,
|
2003-12-08 22:43:41 +00:00
|
|
|
GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE);
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
static void applySubstitutionLookups(
|
2001-01-19 00:30:17 +00:00
|
|
|
const LookupProcessor *lookupProcessor,
|
|
|
|
const SubstitutionLookupRecord *substLookupRecordArray,
|
2000-11-28 20:56:52 +00:00
|
|
|
le_uint16 substCount,
|
|
|
|
GlyphIterator *glyphIterator,
|
2000-12-21 01:18:44 +00:00
|
|
|
const LEFontInstance *fontInstance,
|
2008-10-28 14:50:15 +00:00
|
|
|
le_int32 position,
|
|
|
|
LEErrorCode& success);
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
|
|
|
|
{
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
|
|
|
|
{
|
|
|
|
le_uint16 subRuleSetCount;
|
|
|
|
Offset subRuleSetTableOffsetArray[ANY_NUMBER];
|
|
|
|
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct SubRuleSetTable
|
|
|
|
{
|
|
|
|
le_uint16 subRuleCount;
|
|
|
|
Offset subRuleTableOffsetArray[ANY_NUMBER];
|
|
|
|
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
// NOTE: Multiple variable size arrays!!
|
|
|
|
struct SubRuleTable
|
|
|
|
{
|
|
|
|
le_uint16 glyphCount;
|
|
|
|
le_uint16 substCount;
|
2003-02-05 00:05:40 +00:00
|
|
|
TTGlyphID inputGlyphArray[ANY_NUMBER];
|
2000-11-28 20:56:52 +00:00
|
|
|
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(SubRuleTable, inputGlyphArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
|
|
|
|
{
|
|
|
|
Offset classDefTableOffset;
|
|
|
|
le_uint16 subClassSetCount;
|
|
|
|
Offset subClassSetTableOffsetArray[ANY_NUMBER];
|
|
|
|
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct SubClassSetTable
|
|
|
|
{
|
|
|
|
le_uint16 subClassRuleCount;
|
|
|
|
Offset subClassRuleTableOffsetArray[ANY_NUMBER];
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
// NOTE: Multiple variable size arrays!!
|
|
|
|
struct SubClassRuleTable
|
|
|
|
{
|
|
|
|
le_uint16 glyphCount;
|
|
|
|
le_uint16 substCount;
|
|
|
|
le_uint16 classArray[ANY_NUMBER];
|
|
|
|
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(SubClassRuleTable, classArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
// 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];
|
|
|
|
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
|
|
|
|
{
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
|
|
|
|
{
|
|
|
|
le_uint16 chainSubRuleSetCount;
|
|
|
|
Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];
|
|
|
|
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct ChainSubRuleSetTable
|
|
|
|
{
|
|
|
|
le_uint16 chainSubRuleCount;
|
|
|
|
Offset chainSubRuleTableOffsetArray[ANY_NUMBER];
|
|
|
|
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
// NOTE: Multiple variable size arrays!!
|
|
|
|
struct ChainSubRuleTable
|
|
|
|
{
|
|
|
|
le_uint16 backtrackGlyphCount;
|
2003-02-05 00:05:40 +00:00
|
|
|
TTGlyphID backtrackGlyphArray[ANY_NUMBER];
|
2000-11-28 20:56:52 +00:00
|
|
|
//le_uint16 inputGlyphCount;
|
2003-02-05 00:05:40 +00:00
|
|
|
//TTGlyphID inputGlyphArray[ANY_NUMBER];
|
2000-11-28 20:56:52 +00:00
|
|
|
//le_uint16 lookaheadGlyphCount;
|
2003-02-05 00:05:40 +00:00
|
|
|
//TTGlyphID lookaheadGlyphArray[ANY_NUMBER];
|
2000-11-28 20:56:52 +00:00
|
|
|
//le_uint16 substCount;
|
|
|
|
//SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER];
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable
|
|
|
|
{
|
|
|
|
Offset backtrackClassDefTableOffset;
|
|
|
|
Offset inputClassDefTableOffset;
|
|
|
|
Offset lookaheadClassDefTableOffset;
|
|
|
|
le_uint16 chainSubClassSetCount;
|
|
|
|
Offset chainSubClassSetTableOffsetArray[ANY_NUMBER];
|
|
|
|
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
struct ChainSubClassSetTable
|
|
|
|
{
|
|
|
|
le_uint16 chainSubClassRuleCount;
|
|
|
|
Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER];
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
// 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];
|
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray)
|
2000-11-28 20:56:52 +00:00
|
|
|
|
|
|
|
// 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];
|
|
|
|
|
2008-10-28 14:50:15 +00:00
|
|
|
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
|
2000-11-28 20:56:52 +00:00
|
|
|
};
|
2013-04-18 21:24:51 +00:00
|
|
|
LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
|
|
|
|
|
2000-11-28 20:56:52 +00:00
|
|
|
|
2001-10-16 00:39:01 +00:00
|
|
|
U_NAMESPACE_END
|
2000-11-28 20:56:52 +00:00
|
|
|
#endif
|