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 "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 "GlyphPositioningTables.h" sl@0: #include "SinglePositioningSubtables.h" sl@0: #include "PairPositioningSubtables.h" sl@0: #include "CursiveAttachmentSubtables.h" sl@0: #include "MarkToBasePosnSubtables.h" sl@0: #include "MarkToLigaturePosnSubtables.h" sl@0: #include "MarkToMarkPosnSubtables.h" sl@0: //#include "ContextualPositioningSubtables.h" sl@0: #include "ContextualSubstSubtables.h" sl@0: #include "ExtensionSubtables.h" sl@0: #include "LookupProcessor.h" sl@0: #include "GlyphPosnLookupProc.h" sl@0: #include "LESwaps.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: // Aside from the names, the contextual positioning subtables are sl@0: // the same as the contextual substitution subtables. sl@0: typedef ContextualSubstitutionSubtable ContextualPositioningSubtable; sl@0: typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable; sl@0: sl@0: GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( sl@0: const GlyphPositioningTableHeader *glyphPositioningTableHeader, sl@0: LETag scriptTag, LETag languageTag, const LETag *featureOrder) sl@0: : LookupProcessor( sl@0: (char *) glyphPositioningTableHeader, sl@0: SWAPW(glyphPositioningTableHeader->scriptListOffset), sl@0: SWAPW(glyphPositioningTableHeader->featureListOffset), sl@0: SWAPW(glyphPositioningTableHeader->lookupListOffset), sl@0: scriptTag, languageTag, featureOrder) sl@0: { sl@0: // anything? sl@0: } sl@0: sl@0: GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor() sl@0: { sl@0: } sl@0: sl@0: le_uint32 GlyphPositioningLookupProcessor::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: 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 gpstSingle: sl@0: { sl@0: const SinglePositioningSubtable *subtable = (const SinglePositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fontInstance); sl@0: break; sl@0: } sl@0: sl@0: case gpstPair: sl@0: { sl@0: const PairPositioningSubtable *subtable = (const PairPositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fontInstance); sl@0: break; sl@0: } sl@0: sl@0: case gpstCursive: sl@0: { sl@0: const CursiveAttachmentSubtable *subtable = (const CursiveAttachmentSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fontInstance); sl@0: break; sl@0: } sl@0: sl@0: case gpstMarkToBase: sl@0: { sl@0: const MarkToBasePositioningSubtable *subtable = (const MarkToBasePositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fontInstance); sl@0: break; sl@0: } sl@0: sl@0: case gpstMarkToLigature: sl@0: { sl@0: const MarkToLigaturePositioningSubtable *subtable = (const MarkToLigaturePositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fontInstance); sl@0: break; sl@0: } sl@0: sl@0: case gpstMarkToMark: sl@0: { sl@0: const MarkToMarkPositioningSubtable *subtable = (const MarkToMarkPositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(glyphIterator, fontInstance); sl@0: break; sl@0: } sl@0: sl@0: case gpstContext: sl@0: { sl@0: const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(this, glyphIterator, fontInstance, success); sl@0: break; sl@0: } sl@0: sl@0: case gpstChainedContext: sl@0: { sl@0: const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable; sl@0: sl@0: delta = subtable->process(this, glyphIterator, fontInstance, success); sl@0: break; sl@0: } sl@0: sl@0: case gpstExtension: 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: GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor() sl@0: { sl@0: } sl@0: sl@0: U_NAMESPACE_END