1/* 2 * 3 * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved 4 * 5 */ 6 7#include "LETypes.h" 8#include "LEGlyphFilter.h" 9#include "OpenTypeTables.h" 10#include "GlyphSubstitutionTables.h" 11#include "SingleSubstitutionSubtables.h" 12#include "GlyphIterator.h" 13#include "LESwaps.h" 14 15U_NAMESPACE_BEGIN 16 17le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const 18{ 19 switch(SWAPW(subtableFormat)) 20 { 21 case 0: 22 return 0; 23 24 case 1: 25 { 26 const SingleSubstitutionFormat1Subtable *subtable = (const SingleSubstitutionFormat1Subtable *) this; 27 28 return subtable->process(glyphIterator, filter); 29 } 30 31 case 2: 32 { 33 const SingleSubstitutionFormat2Subtable *subtable = (const SingleSubstitutionFormat2Subtable *) this; 34 35 return subtable->process(glyphIterator, filter); 36 } 37 38 default: 39 return 0; 40 } 41} 42 43le_uint32 SingleSubstitutionFormat1Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const 44{ 45 LEGlyphID glyph = glyphIterator->getCurrGlyphID(); 46 le_int32 coverageIndex = getGlyphCoverage(glyph); 47 48 if (coverageIndex >= 0) { 49 TTGlyphID substitute = ((TTGlyphID) LE_GET_GLYPH(glyph)) + SWAPW(deltaGlyphID); 50 51 if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { 52 glyphIterator->setCurrGlyphID(substitute); 53 } 54 55 return 1; 56 } 57 58 return 0; 59} 60 61le_uint32 SingleSubstitutionFormat2Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const 62{ 63 LEGlyphID glyph = glyphIterator->getCurrGlyphID(); 64 le_int32 coverageIndex = getGlyphCoverage(glyph); 65 66 if (coverageIndex >= 0) { 67 TTGlyphID substitute = SWAPW(substituteArray[coverageIndex]); 68 69 if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { 70 glyphIterator->setCurrGlyphID(substitute); 71 } 72 73 return 1; 74 } 75 76 return 0; 77} 78 79U_NAMESPACE_END 80