diff -r 000000000000 -r bde4ae8d615e os/textandloc/fontservices/textshaperplugin/IcuSource/layout/MPreFixups.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/textandloc/fontservices/textshaperplugin/IcuSource/layout/MPreFixups.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,103 @@ +/* + * + * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphStorage.h" +#include "MPreFixups.h" + +U_NAMESPACE_BEGIN + +struct FixupData +{ + le_int32 fBaseIndex; + le_int32 fMPreIndex; +}; + +MPreFixups::MPreFixups(le_int32 charCount) + : fFixupData(NULL), fFixupCount(0) +{ + fFixupData = LE_NEW_ARRAY(FixupData, charCount); +} + +MPreFixups::~MPreFixups() +{ + LE_DELETE_ARRAY(fFixupData); + fFixupData = NULL; +} + +void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex) +{ + // NOTE: don't add the fixup data if the mpre is right + // before the base consonant glyph. + if (baseIndex - mpreIndex > 1) { + fFixupData[fFixupCount].fBaseIndex = baseIndex; + fFixupData[fFixupCount].fMPreIndex = mpreIndex; + + fFixupCount += 1; + } +} + +void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success) +{ + if (LE_FAILURE(success)) { + return; + } + + for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) { + le_int32 baseIndex = fFixupData[fixup].fBaseIndex; + le_int32 mpreIndex = fFixupData[fixup].fMPreIndex; + le_int32 mpreLimit = mpreIndex + 1; + + while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) { + baseIndex -= 1; + } + + while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) { + mpreLimit += 1; + } + + if (mpreLimit == baseIndex) { + continue; + } + + LEErrorCode success = LE_NO_ERROR; + le_int32 mpreCount = mpreLimit - mpreIndex; + le_int32 moveCount = baseIndex - mpreLimit; + le_int32 mpreDest = baseIndex - mpreCount; + LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount); + le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount); + if (!mpreSave || !indexSave) { + LE_DELETE_ARRAY(mpreSave); + LE_DELETE_ARRAY(indexSave); + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + le_int32 i; + + for (i = 0; i < mpreCount; i += 1) { + mpreSave[i] = glyphStorage[mpreIndex + i]; + indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i]; + } + + for (i = 0; i < moveCount; i += 1) { + LEGlyphID glyph = glyphStorage[mpreLimit + i]; + le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success); + + glyphStorage[mpreIndex + i] = glyph; + glyphStorage.setCharIndex(mpreIndex + i, charIndex, success); + } + + for (i = 0; i < mpreCount; i += 1) { + glyphStorage[mpreDest + i] = mpreSave[i]; + glyphStorage.setCharIndex(mpreDest, indexSave[i], success); + } + + LE_DELETE_ARRAY(indexSave); + LE_DELETE_ARRAY(mpreSave); + } +} + +U_NAMESPACE_END