sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "LEGlyphFilter.h" sl@0: #include "LEFontInstance.h" sl@0: #include "OpenTypeTables.h" sl@0: #include "Features.h" sl@0: #include "Lookups.h" sl@0: #include "ScriptAndLanguage.h" sl@0: #include "GlyphDefinitionTables.h" sl@0: #include "GlyphSubstitutionTables.h" sl@0: #include "SingleSubstitutionSubtables.h" sl@0: #include "MultipleSubstSubtables.h" sl@0: #include "AlternateSubstSubtables.h" sl@0: #include "LigatureSubstSubtables.h" sl@0: #include "ContextualSubstSubtables.h" sl@0: #include "ExtensionSubtables.h" sl@0: #include "LookupProcessor.h" sl@0: #include "GlyphSubstLookupProc.h" sl@0: #include "LESwaps.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( sl@0: const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, sl@0: LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const LETag *featureOrder) sl@0: : LookupProcessor( sl@0: (char *) glyphSubstitutionTableHeader, sl@0: SWAPW(glyphSubstitutionTableHeader->scriptListOffset), sl@0: SWAPW(glyphSubstitutionTableHeader->featureListOffset), sl@0: SWAPW(glyphSubstitutionTableHeader->lookupListOffset), sl@0: scriptTag, languageTag, featureOrder), fFilter(filter) sl@0: { sl@0: // anything? sl@0: } sl@0: sl@0: GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor() sl@0: { sl@0: } sl@0: sl@0: le_uint32 GlyphSubstitutionLookupProcessor::applySubtable( sl@0: const LookupSubtable *lookupSubtable, le_uint16 lookupType, sl@0: GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, sl@0: LEErrorCode& success) const sl@0: { sl@0: if (LE_FAILURE(success)) { sl@0: return 0; sl@0: } sl@0: le_uint32 delta = 0; sl@0: sl@0: switch(lookupType) sl@0: { sl@0: case 0: sl@0: break; sl@0: sl@0: case gsstSingle: sl@0: { sl@0: const SingleSubstitutionSubtable *subtable = (const SingleSubstitutionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fFilter); sl@0: break; sl@0: } sl@0: sl@0: case gsstMultiple: sl@0: { sl@0: const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, success, fFilter); sl@0: break; sl@0: } sl@0: sl@0: case gsstAlternate: sl@0: { sl@0: const AlternateSubstitutionSubtable *subtable = (const AlternateSubstitutionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fFilter); sl@0: break; sl@0: } sl@0: sl@0: case gsstLigature: sl@0: { sl@0: const LigatureSubstitutionSubtable *subtable = (const LigatureSubstitutionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fFilter); sl@0: break; sl@0: } sl@0: sl@0: case gsstContext: sl@0: { sl@0: const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(this, glyphIterator, fontInstance, success); sl@0: break; sl@0: } sl@0: sl@0: case gsstChainingContext: sl@0: { sl@0: const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(this, glyphIterator, fontInstance, success); sl@0: break; sl@0: } sl@0: sl@0: case gsstExtension: sl@0: { sl@0: const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); sl@0: break; sl@0: } sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: return delta; sl@0: } sl@0: sl@0: GlyphSubstitutionLookupProcessor::~GlyphSubstitutionLookupProcessor() sl@0: { sl@0: } sl@0: sl@0: U_NAMESPACE_END