First public contribution.
3 * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved
8 #include "LEGlyphStorage.h"
9 #include "MPreFixups.h"
19 MPreFixups::MPreFixups(le_int32 charCount)
20 : fFixupData(NULL), fFixupCount(0)
22 fFixupData = LE_NEW_ARRAY(FixupData, charCount);
25 MPreFixups::~MPreFixups()
27 LE_DELETE_ARRAY(fFixupData);
31 void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex)
33 // NOTE: don't add the fixup data if the mpre is right
34 // before the base consonant glyph.
35 if (baseIndex - mpreIndex > 1) {
36 fFixupData[fFixupCount].fBaseIndex = baseIndex;
37 fFixupData[fFixupCount].fMPreIndex = mpreIndex;
43 void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success)
45 if (LE_FAILURE(success)) {
49 for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {
50 le_int32 baseIndex = fFixupData[fixup].fBaseIndex;
51 le_int32 mpreIndex = fFixupData[fixup].fMPreIndex;
52 le_int32 mpreLimit = mpreIndex + 1;
54 while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) {
58 while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) {
62 if (mpreLimit == baseIndex) {
66 LEErrorCode success = LE_NO_ERROR;
67 le_int32 mpreCount = mpreLimit - mpreIndex;
68 le_int32 moveCount = baseIndex - mpreLimit;
69 le_int32 mpreDest = baseIndex - mpreCount;
70 LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount);
71 le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount);
72 if (!mpreSave || !indexSave) {
73 LE_DELETE_ARRAY(mpreSave);
74 LE_DELETE_ARRAY(indexSave);
75 success = LE_MEMORY_ALLOCATION_ERROR;
80 for (i = 0; i < mpreCount; i += 1) {
81 mpreSave[i] = glyphStorage[mpreIndex + i];
82 indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i];
85 for (i = 0; i < moveCount; i += 1) {
86 LEGlyphID glyph = glyphStorage[mpreLimit + i];
87 le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success);
89 glyphStorage[mpreIndex + i] = glyph;
90 glyphStorage.setCharIndex(mpreIndex + i, charIndex, success);
93 for (i = 0; i < mpreCount; i += 1) {
94 glyphStorage[mpreDest + i] = mpreSave[i];
95 glyphStorage.setCharIndex(mpreDest, indexSave[i], success);
98 LE_DELETE_ARRAY(indexSave);
99 LE_DELETE_ARRAY(mpreSave);