diff options
Diffstat (limited to 'Build/source/libs/icu/icu-4.8.1/layout/SingleSubstitutionSubtables.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-4.8.1/layout/SingleSubstitutionSubtables.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.8.1/layout/SingleSubstitutionSubtables.cpp b/Build/source/libs/icu/icu-4.8.1/layout/SingleSubstitutionSubtables.cpp new file mode 100644 index 00000000000..ae72ddfd04f --- /dev/null +++ b/Build/source/libs/icu/icu-4.8.1/layout/SingleSubstitutionSubtables.cpp @@ -0,0 +1,79 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "SingleSubstitutionSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + switch(SWAPW(subtableFormat)) + { + case 0: + return 0; + + case 1: + { + const SingleSubstitutionFormat1Subtable *subtable = (const SingleSubstitutionFormat1Subtable *) this; + + return subtable->process(glyphIterator, filter); + } + + case 2: + { + const SingleSubstitutionFormat2Subtable *subtable = (const SingleSubstitutionFormat2Subtable *) this; + + return subtable->process(glyphIterator, filter); + } + + default: + return 0; + } +} + +le_uint32 SingleSubstitutionFormat1Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + TTGlyphID substitute = ((TTGlyphID) LE_GET_GLYPH(glyph)) + SWAPW(deltaGlyphID); + + if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { + glyphIterator->setCurrGlyphID(substitute); + } + + return 1; + } + + return 0; +} + +le_uint32 SingleSubstitutionFormat2Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + TTGlyphID substitute = SWAPW(substituteArray[coverageIndex]); + + if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { + glyphIterator->setCurrGlyphID(substitute); + } + + return 1; + } + + return 0; +} + +U_NAMESPACE_END |