--- icu.orig/source/layout/IndicReordering.cpp 2006-12-21 09:24:42.000000000 +0000 +++ icu/source/layout/IndicReordering.cpp 2006-12-21 09:16:15.000000000 +0000 @@ -50,6 +50,14 @@ #define distFeatureMask 0x00010000UL #define initFeatureMask 0x00008000UL +// TODO: Find better names for these! +#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) +#define tagArray3 (pstfFeatureMask | tagArray4) +#define tagArray2 (halfFeatureMask | tagArray3) +#define tagArray1 (blwfFeatureMask | tagArray2) +#define tagArray0 (rphfFeatureMask | tagArray1) + + class IndicReorderingOutput : public UMemory { private: le_int32 fOutIndex; @@ -154,6 +162,27 @@ fSMabove = fSMbelow = 0; } + void swapChars(int a, int b) + { + LEErrorCode success = LE_NO_ERROR; + LEUnicode temp_char; + le_uint32 temp_index; + FeatureMask temp_tag; + + temp_char = fOutChars[fOutIndex + b]; + temp_index = fGlyphStorage.getCharIndex(fOutIndex + b, success); + temp_tag = fGlyphStorage.getAuxData(fOutIndex + b, success); + + fOutChars[fOutIndex + b] = fOutChars[fOutIndex + a]; + le_uint32 toswap = fGlyphStorage.getCharIndex(fOutIndex + a, success); + fGlyphStorage.setCharIndex(fOutIndex + b, toswap, success); + fGlyphStorage.setAuxData(fOutIndex + b, tagArray3, success); + + fOutChars[fOutIndex + a] = temp_char; + fGlyphStorage.setCharIndex(fOutIndex + a, temp_index, success); + fGlyphStorage.setAuxData(fOutIndex + a, temp_tag, success); + } + void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) { LEErrorCode success = LE_NO_ERROR; @@ -335,13 +364,6 @@ C_DOTTED_CIRCLE = 0x25CC }; -// TODO: Find better names for these! -#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) -#define tagArray3 (pstfFeatureMask | tagArray4) -#define tagArray2 (halfFeatureMask | tagArray3) -#define tagArray1 (blwfFeatureMask | tagArray2) -#define tagArray0 (rphfFeatureMask | tagArray1) - static const FeatureMap featureMap[] = { {loclFeatureTag, loclFeatureMask}, @@ -559,6 +623,17 @@ hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta; hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta; + /* for the special conjuction of Cons+0x0d4d+0x0d30 of Malayalam */ + if ((baseConsonant - 2 >= 0) && hasPostBaseForm && + (chars[baseConsonant - 1] == 0x0d4d) && + (chars[baseConsonant] == 0x0d30) && + ((chars[baseConsonant - 2] >= 0x0d15) && + (chars[baseConsonant - 2] <= 0x0d39))) { + if (baseConsonant < 3 || chars[baseConsonant - 3] != 0x0d4d) { + hasPostBaseForm = false; + } + } + if (IndicClassTable::isConsonant(charClass)) { if (postBaseLimit == 0 || seenVattu || (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) || @@ -645,6 +720,20 @@ output.writeChar(chars[i], i, tagArray4); } + /* for the special conjuction of Cons+0x0d4d+0x0d30 of Malayalam */ + if ((baseConsonant - 2 >= 0) && + (chars[baseConsonant - 1] == 0x0d4d) && + (chars[baseConsonant] == 0x0d30) && + ((chars[baseConsonant - 2] >= 0x0d15) && + (chars[baseConsonant - 2] <= 0x0d39))) { + if (baseConsonant < 3 || chars[baseConsonant - 3] != 0x0d4d) { + output.swapChars(-1, -3); + + if (mpreFixups) + mpreFixups->reduce(); + } + } + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) { output.writeMbelow(); output.writeSMbelow(); // FIXME: there are no SMs in these scripts... --- icu.orig/source/layout/MPreFixups.h 2006-11-10 09:42:47.000000000 +0000 +++ icu/source/layout/MPreFixups.h 2006-12-21 09:13:47.000000000 +0000 @@ -31,6 +31,8 @@ void apply(LEGlyphStorage &glyphStorage); + void reduce(); + private: FixupData *fFixupData; le_int32 fFixupCount; --- icu.orig/source/layout/MPreFixups.cpp 2006-11-10 09:42:47.000000000 +0000 +++ icu/source/layout/MPreFixups.cpp 2006-12-21 09:16:33.000000000 +0000 @@ -40,6 +40,12 @@ } } +void MPreFixups::reduce() +{ + if (fFixupCount > 0) + fFixupCount--; +} + void MPreFixups::apply(LEGlyphStorage &glyphStorage) { for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {