sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "LEGlyphStorage.h" sl@0: #include "MPreFixups.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: struct FixupData sl@0: { sl@0: le_int32 fBaseIndex; sl@0: le_int32 fMPreIndex; sl@0: }; sl@0: sl@0: MPreFixups::MPreFixups(le_int32 charCount) sl@0: : fFixupData(NULL), fFixupCount(0) sl@0: { sl@0: fFixupData = LE_NEW_ARRAY(FixupData, charCount); sl@0: } sl@0: sl@0: MPreFixups::~MPreFixups() sl@0: { sl@0: LE_DELETE_ARRAY(fFixupData); sl@0: fFixupData = NULL; sl@0: } sl@0: sl@0: void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex) sl@0: { sl@0: // NOTE: don't add the fixup data if the mpre is right sl@0: // before the base consonant glyph. sl@0: if (baseIndex - mpreIndex > 1) { sl@0: fFixupData[fFixupCount].fBaseIndex = baseIndex; sl@0: fFixupData[fFixupCount].fMPreIndex = mpreIndex; sl@0: sl@0: fFixupCount += 1; sl@0: } sl@0: } sl@0: sl@0: void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success) sl@0: { sl@0: if (LE_FAILURE(success)) { sl@0: return; sl@0: } sl@0: sl@0: for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) { sl@0: le_int32 baseIndex = fFixupData[fixup].fBaseIndex; sl@0: le_int32 mpreIndex = fFixupData[fixup].fMPreIndex; sl@0: le_int32 mpreLimit = mpreIndex + 1; sl@0: sl@0: while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) { sl@0: baseIndex -= 1; sl@0: } sl@0: sl@0: while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) { sl@0: mpreLimit += 1; sl@0: } sl@0: sl@0: if (mpreLimit == baseIndex) { sl@0: continue; sl@0: } sl@0: sl@0: LEErrorCode success = LE_NO_ERROR; sl@0: le_int32 mpreCount = mpreLimit - mpreIndex; sl@0: le_int32 moveCount = baseIndex - mpreLimit; sl@0: le_int32 mpreDest = baseIndex - mpreCount; sl@0: LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount); sl@0: le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount); sl@0: if (!mpreSave || !indexSave) { sl@0: LE_DELETE_ARRAY(mpreSave); sl@0: LE_DELETE_ARRAY(indexSave); sl@0: success = LE_MEMORY_ALLOCATION_ERROR; sl@0: return; sl@0: } sl@0: le_int32 i; sl@0: sl@0: for (i = 0; i < mpreCount; i += 1) { sl@0: mpreSave[i] = glyphStorage[mpreIndex + i]; sl@0: indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i]; sl@0: } sl@0: sl@0: for (i = 0; i < moveCount; i += 1) { sl@0: LEGlyphID glyph = glyphStorage[mpreLimit + i]; sl@0: le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success); sl@0: sl@0: glyphStorage[mpreIndex + i] = glyph; sl@0: glyphStorage.setCharIndex(mpreIndex + i, charIndex, success); sl@0: } sl@0: sl@0: for (i = 0; i < mpreCount; i += 1) { sl@0: glyphStorage[mpreDest + i] = mpreSave[i]; sl@0: glyphStorage.setCharIndex(mpreDest, indexSave[i], success); sl@0: } sl@0: sl@0: LE_DELETE_ARRAY(indexSave); sl@0: LE_DELETE_ARRAY(mpreSave); sl@0: } sl@0: } sl@0: sl@0: U_NAMESPACE_END