X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/b75a7d8f3b4adbae880cab104ce2c6a50eee4db2..e33e88b05ea89f292e476b668b5ee95a095e0ffb:/icuSources/layout/MultipleSubstSubtables.cpp diff --git a/icuSources/layout/MultipleSubstSubtables.cpp b/icuSources/layout/MultipleSubstSubtables.cpp index 65b0c610..450bf35b 100644 --- a/icuSources/layout/MultipleSubstSubtables.cpp +++ b/icuSources/layout/MultipleSubstSubtables.cpp @@ -1,7 +1,6 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -18,6 +17,18 @@ U_NAMESPACE_BEGIN le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const { LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + + // If there's a filter, we only want to do the + // substitution if the *input* glyphs doesn't + // exist. + // + // FIXME: is this always the right thing to do? + // FIXME: should this only be done for a non-zero + // glyphCount? + if (filter != NULL && filter->accept(glyph)) { + return 0; + } + le_int32 coverageIndex = getGlyphCoverage(glyph); le_uint16 seqCount = SWAPW(sequenceCount); @@ -29,17 +40,43 @@ le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, co if (glyphCount == 0) { glyphIterator->setCurrGlyphID(0xFFFF); return 1; - } else if (glyphCount >= 1) { + } else if (glyphCount == 1) { TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[0]); - if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { - glyphIterator->setCurrGlyphID(substitute); + if (filter != NULL && ! filter->accept(LE_SET_GLYPH(glyph, substitute))) { + return 0; } + glyphIterator->setCurrGlyphID(substitute); return 1; } else { - // Can't do this 'till there's a way to - // grow the glyph array... + // If there's a filter, make sure all of the output glyphs + // exist. + if (filter != NULL) { + for (le_int32 i = 0; i < glyphCount; i += 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); + + if (! filter->accept(substitute)) { + return 0; + } + } + } + + LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount); + le_int32 insert = 0, direction = 1; + + if (glyphIterator->isRightToLeft()) { + insert = glyphCount - 1; + direction = -1; + } + + for (le_int32 i = 0; i < glyphCount; i += 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); + + newGlyphs[insert] = LE_SET_GLYPH(glyph, substitute); + insert += direction; + } + return 1; } }