1/* 2 * 3 * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved 4 * 5 */ 6 7#include "LETypes.h" 8#include "LEGlyphFilter.h" 9#include "LEFontInstance.h" 10#include "OpenTypeTables.h" 11#include "ICUFeatures.h" 12#include "Lookups.h" 13#include "ScriptAndLanguage.h" 14#include "GlyphDefinitionTables.h" 15#include "GlyphSubstitutionTables.h" 16#include "SingleSubstitutionSubtables.h" 17#include "MultipleSubstSubtables.h" 18#include "AlternateSubstSubtables.h" 19#include "LigatureSubstSubtables.h" 20#include "ContextualSubstSubtables.h" 21#include "ExtensionSubtables.h" 22#include "LookupProcessor.h" 23#include "GlyphSubstLookupProc.h" 24#include "LESwaps.h" 25 26U_NAMESPACE_BEGIN 27 28GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( 29 const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, 30 LETag scriptTag, 31 LETag languageTag, 32 const LEGlyphFilter *filter, 33 const FeatureMap *featureMap, 34 le_int32 featureMapCount, 35 le_bool featureOrder, 36 LEErrorCode& success) 37 : LookupProcessor( 38 (char *) glyphSubstitutionTableHeader, 39 SWAPW(glyphSubstitutionTableHeader->scriptListOffset), 40 SWAPW(glyphSubstitutionTableHeader->featureListOffset), 41 SWAPW(glyphSubstitutionTableHeader->lookupListOffset), 42 scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success), fFilter(filter) 43{ 44 // anything? 45} 46 47GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor() 48{ 49} 50 51le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, 52 GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const 53{ 54 if (LE_FAILURE(success)) { 55 return 0; 56 } 57 58 le_uint32 delta = 0; 59 60 switch(lookupType) 61 { 62 case 0: 63 break; 64 65 case gsstSingle: 66 { 67 const SingleSubstitutionSubtable *subtable = (const SingleSubstitutionSubtable *) lookupSubtable; 68 69 delta = subtable->process(glyphIterator, fFilter); 70 break; 71 } 72 73 case gsstMultiple: 74 { 75 const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable; 76 77 delta = subtable->process(glyphIterator, success, fFilter); 78 break; 79 } 80 81 case gsstAlternate: 82 { 83 const AlternateSubstitutionSubtable *subtable = (const AlternateSubstitutionSubtable *) lookupSubtable; 84 85 delta = subtable->process(glyphIterator, fFilter); 86 break; 87 } 88 89 case gsstLigature: 90 { 91 const LigatureSubstitutionSubtable *subtable = (const LigatureSubstitutionSubtable *) lookupSubtable; 92 93 delta = subtable->process(glyphIterator, fFilter); 94 break; 95 } 96 97 case gsstContext: 98 { 99 const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable; 100 101 delta = subtable->process(this, glyphIterator, fontInstance, success); 102 break; 103 } 104 105 case gsstChainingContext: 106 { 107 const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable; 108 109 delta = subtable->process(this, glyphIterator, fontInstance, success); 110 break; 111 } 112 113 case gsstExtension: 114 { 115 const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; 116 117 delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); 118 break; 119 } 120 121 default: 122 break; 123 } 124 125 return delta; 126} 127 128GlyphSubstitutionLookupProcessor::~GlyphSubstitutionLookupProcessor() 129{ 130} 131 132U_NAMESPACE_END 133