diff -ruN icu.orig/source/layout/IndicReordering.h icu/source/layout/IndicReordering.h --- icu.orig/source/layout/IndicReordering.h 2007-04-27 10:28:22.000000000 +0100 +++ icu/source/layout/IndicReordering.h 2007-04-27 10:39:22.000000000 +0100 @@ -142,6 +142,7 @@ // do not instantiate IndicReordering(); +public: static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); }; diff -ruN icu.orig/source/layout/LayoutEngine.cpp icu/source/layout/LayoutEngine.cpp --- icu.orig/source/layout/LayoutEngine.cpp 2007-04-27 10:28:22.000000000 +0100 +++ icu/source/layout/LayoutEngine.cpp 2007-04-27 10:39:22.000000000 +0100 @@ -14,6 +14,7 @@ #include "CanonShaping.h" #include "HanLayoutEngine.h" #include "HangulLayoutEngine.h" +#include "MalayalamLayoutEngine.h" #include "IndicLayoutEngine.h" #include "KhmerLayoutEngine.h" #include "ThaiLayoutEngine.h" @@ -451,11 +452,13 @@ if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) { switch (scriptCode) { + case mlymScriptCode: + result = new MalayalamOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; case bengScriptCode: case devaScriptCode: case gujrScriptCode: case kndaScriptCode: - case mlymScriptCode: case oryaScriptCode: case guruScriptCode: case tamlScriptCode: @@ -512,11 +515,13 @@ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable); } else { switch (scriptCode) { + case mlymScriptCode: + result = new MalayalamOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); + break; case bengScriptCode: case devaScriptCode: case gujrScriptCode: case kndaScriptCode: - case mlymScriptCode: case oryaScriptCode: case guruScriptCode: case tamlScriptCode: diff -ruN icu.orig/source/layout/LEGlyphStorage.h icu/source/layout/LEGlyphStorage.h --- icu.orig/source/layout/LEGlyphStorage.h 2007-04-27 10:28:22.000000000 +0100 +++ icu/source/layout/LEGlyphStorage.h 2007-04-27 10:43:54.000000000 +0100 @@ -413,6 +413,8 @@ */ void adoptGlyphArray(LEGlyphStorage &from); + void appendGlyphStorage(LEGlyphStorage &from); + /** * Delete the char indices array and replace it with the one * in from. Set the char indices array pointer diff -ruN icu.orig/source/layout/Makefile.in icu/source/layout/Makefile.in --- icu.orig/source/layout/Makefile.in 2007-04-27 10:28:22.000000000 +0100 +++ icu/source/layout/Makefile.in 2007-04-27 10:39:22.000000000 +0100 @@ -66,6 +66,7 @@ ArabicLayoutEngine.o \ GXLayoutEngine.o \ HanLayoutEngine.o \ +MalayalamLayoutEngine.o \ IndicLayoutEngine.o \ LayoutEngine.o \ ContextualGlyphSubstProc.o \ diff -ruN icu.orig/source/layout/MalayalamLayoutEngine.cpp icu/source/layout/MalayalamLayoutEngine.cpp --- icu.orig/source/layout/MalayalamLayoutEngine.cpp 1970-01-01 01:00:00.000000000 +0100 +++ icu/source/layout/MalayalamLayoutEngine.cpp 2007-04-27 10:44:26.000000000 +0100 @@ -0,0 +1,121 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" +#include "MalayalamLayoutEngine.h" +#include "ScriptAndLanguageTags.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +#include "GDEFMarkFilter.h" +#include "LEGlyphStorage.h" + +#include "IndicReordering.h" + +#include + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MalayalamOpenTypeLayoutEngine) + +void LEGlyphStorage::appendGlyphStorage(LEGlyphStorage &from) +{ + if (fInsertionList) applyInsertions(); + if (from.fInsertionList) from.applyInsertions(); + + if (!from.fGlyphCount) + return; + + le_int32 newGlyphCount = fGlyphCount + from.fGlyphCount; + + fGlyphs = (LEGlyphID*)LE_GROW_ARRAY(fGlyphs, newGlyphCount); + LE_ARRAY_COPY(fGlyphs+fGlyphCount, from.fGlyphs, from.fGlyphCount); + + le_int32 nLargestIndex = 0; + if (fGlyphCount) + { + for (le_int32 i = 0; i < fGlyphCount; ++i) + { + if (fCharIndices[i] > nLargestIndex) + nLargestIndex = fCharIndices[i]; + } + nLargestIndex+=1; + } + fCharIndices = (le_int32 *)LE_GROW_ARRAY(fCharIndices, newGlyphCount); + for (le_int32 i = 0; i < from.fGlyphCount; ++i) + fCharIndices[fGlyphCount+i] = from.fCharIndices[i] + nLargestIndex; + + fAuxData = (le_uint32 *)LE_GROW_ARRAY(fAuxData, newGlyphCount); + LE_ARRAY_COPY(fAuxData+fGlyphCount, from.fAuxData, from.fGlyphCount); + + fGlyphCount = newGlyphCount; +} + +le_int32 MalayalamOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + glyphStorage.appendGlyphStorage(tempGlyphStorage); + + return glyphStorage.getGlyphCount(); +} + + +le_int32 MalayalamOpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 outGlyphCount=0; + + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(fScriptCode); + le_int32 prev = 0; + while (prev < count) + { + le_int32 outCharCount=0, fakeGlyphCount=0,fSyllableCount=0; + LEUnicode *outChars = NULL; + LEGlyphStorage fakeGlyphStorage; + + le_int32 syllable = IndicReordering::findSyllable(classTable, chars+offset, prev, count); + outCharCount = characterProcessing(chars+prev, offset, syllable-prev, max, rightToLeft, outChars, fakeGlyphStorage, success, ++fSyllableCount); + + if (LE_FAILURE(success)) { + return 0; + } + + if (outChars != NULL) { + fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success); + LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... + } else { + fakeGlyphCount = glyphProcessing(chars+prev, offset, syllable-prev, max, rightToLeft, fakeGlyphStorage, success); + } + + if (LE_FAILURE(success)) { + return 0; + } + + outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success); + + prev = syllable; + } + + return outGlyphCount; +} + +U_NAMESPACE_END diff -ruN icu.orig/source/layout/MalayalamLayoutEngine.h icu/source/layout/MalayalamLayoutEngine.h --- icu.orig/source/layout/MalayalamLayoutEngine.h 1970-01-01 01:00:00.000000000 +0100 +++ icu/source/layout/MalayalamLayoutEngine.h 2007-04-27 10:39:52.000000000 +0100 @@ -0,0 +1,41 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __MALAYALAMLAYOUTENGINE_H +#define __MALAYALAMLAYOUTENGINE_H + +#include "IndicLayoutEngine.h" + +U_NAMESPACE_BEGIN + +class MalayalamOpenTypeLayoutEngine : public IndicOpenTypeLayoutEngine +{ +public: + MalayalamOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) : + IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) + + {} + + MalayalamOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags) : + IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) + + {} + + virtual UClassID getDynamicClassID() const; + static UClassID getStaticClassID(); + +protected: + virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); +}; + +U_NAMESPACE_END +#endif + diff -ru icu.orig/source/layout/MalayalamLayoutEngine.cpp icu/source/layout/MalayalamLayoutEngine.cpp --- icu.orig/source/layout/MalayalamLayoutEngine.cpp 2007-11-28 10:44:11.000000000 +0000 +++ icu/source/layout/MalayalamLayoutEngine.cpp 2007-11-28 11:40:18.000000000 +0000 @@ -30,6 +30,11 @@ { if (fInsertionList) applyInsertions(); if (from.fInsertionList) from.applyInsertions(); + if ((!fInsertionList) && (from.fInsertionList)) + { + fInsertionList = from.fInsertionList; + from.fInsertionList = NULL; + } if (!from.fGlyphCount) return; diff -ru icu/source/layout/ArabicLayoutEngine.cpp icu.works/source/layout/ArabicLayoutEngine.cpp --- icu.orig/source/layout/ArabicLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/ArabicLayoutEngine.cpp 2008-01-25 12:19:42.000000000 +0000 @@ -64,7 +64,7 @@ // Output: characters, char indices, tags // Returns: output character count le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/ArabicLayoutEngine.h icu.works/source/layout/ArabicLayoutEngine.h --- icu.orig/source/layout/ArabicLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/ArabicLayoutEngine.h 2008-01-25 12:20:14.000000000 +0000 @@ -112,7 +112,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount); /** * This method applies the GPOS table if it is present, otherwise it ensures that all vowel diff -ru icu/source/layout/HangulLayoutEngine.cpp icu.works/source/layout/HangulLayoutEngine.cpp --- icu.orig/source/layout/HangulLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/HangulLayoutEngine.cpp 2008-01-25 12:20:38.000000000 +0000 @@ -207,7 +207,7 @@ } le_int32 HangulOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/HangulLayoutEngine.h icu.works/source/layout/HangulLayoutEngine.h --- icu.orig/source/layout/HangulLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/HangulLayoutEngine.h 2008-01-25 12:21:15.000000000 +0000 @@ -117,7 +117,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount=0); }; U_NAMESPACE_END diff -ru icu/source/layout/HanLayoutEngine.cpp icu.works/source/layout/HanLayoutEngine.cpp --- icu.orig/source/layout/HanLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/HanLayoutEngine.cpp 2008-01-25 12:21:25.000000000 +0000 @@ -52,7 +52,7 @@ } le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/HanLayoutEngine.h icu.works/source/layout/HanLayoutEngine.h --- icu.orig/source/layout/HanLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/HanLayoutEngine.h 2008-01-25 12:21:32.000000000 +0000 @@ -96,7 +96,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount=0); }; diff -ru icu/source/layout/IndicLayoutEngine.cpp icu.works/source/layout/IndicLayoutEngine.cpp --- icu.orig/source/layout/IndicLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/IndicLayoutEngine.cpp 2008-01-25 12:13:41.000000000 +0000 @@ -75,7 +75,7 @@ // Output: characters, char indices, tags // Returns: output character count le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount) { if (LE_FAILURE(success)) { return 0; @@ -105,7 +105,7 @@ // NOTE: assumes this allocates featureTags... // (probably better than doing the worst case stuff here...) - le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups); + le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, fSyllableCount); glyphStorage.adoptGlyphCount(outCharCount); return outCharCount; diff -ru icu/source/layout/IndicLayoutEngine.h icu.works/source/layout/IndicLayoutEngine.h --- icu.orig/source/layout/IndicLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/IndicLayoutEngine.h 2008-01-25 12:13:12.000000000 +0000 @@ -119,7 +119,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount = 0); /** * This method does character to glyph mapping, applies the GSUB table and applies diff -ru icu/source/layout/IndicReordering.cpp icu.works/source/layout/IndicReordering.cpp --- icu.orig/source/layout/IndicReordering.cpp 2008-01-25 12:23:56.000000000 +0000 +++ icu/source/layout/IndicReordering.cpp 2008-01-25 12:15:32.000000000 +0000 @@ -138,8 +138,8 @@ } public: - IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups) - : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), + IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups,le_int32 fSyllableCount_) + : fSyllableCount(fSyllableCount_), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0), fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fVirama(0), fViramaIndex(0), fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups), @@ -480,7 +480,7 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, LEUnicode *outChars, LEGlyphStorage &glyphStorage, - MPreFixups **outMPreFixups) + MPreFixups **outMPreFixups, le_int32 fSyllableCount) { MPreFixups *mpreFixups = NULL; const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); @@ -489,7 +489,7 @@ mpreFixups = new MPreFixups(charCount); } - IndicReorderingOutput output(outChars, glyphStorage, mpreFixups); + IndicReorderingOutput output(outChars, glyphStorage, mpreFixups, fSyllableCount); le_int32 i, prev = 0; le_bool lastInWord = FALSE; diff -ru icu/source/layout/IndicReordering.h icu.works/source/layout/IndicReordering.h --- icu.orig/source/layout/IndicReordering.h 2008-01-25 12:23:56.000000000 +0000 +++ icu/source/layout/IndicReordering.h 2008-01-25 12:13:59.000000000 +0000 @@ -132,7 +132,7 @@ static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, LEUnicode *outChars, LEGlyphStorage &glyphStorage, - MPreFixups **outMPreFixups); + MPreFixups **outMPreFixups, le_int32 fSyllableCount = 0); static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage); diff -ru icu/source/layout/KhmerLayoutEngine.cpp icu.works/source/layout/KhmerLayoutEngine.cpp --- icu.orig/source/layout/KhmerLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/KhmerLayoutEngine.cpp 2008-01-25 12:21:48.000000000 +0000 @@ -42,7 +42,7 @@ // Output: characters, char indices, tags // Returns: output character count le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/KhmerLayoutEngine.h icu.works/source/layout/KhmerLayoutEngine.h --- icu.orig/source/layout/KhmerLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/KhmerLayoutEngine.h 2008-01-25 12:21:56.000000000 +0000 @@ -120,7 +120,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount=0); }; diff -ru icu/source/layout/LayoutEngine.cpp icu.works/source/layout/LayoutEngine.cpp --- icu.orig/source/layout/LayoutEngine.cpp 2008-01-25 12:23:56.000000000 +0000 +++ icu/source/layout/LayoutEngine.cpp 2008-01-25 12:22:05.000000000 +0000 @@ -180,7 +180,7 @@ } le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/LayoutEngine.h icu.works/source/layout/LayoutEngine.h --- icu.orig/source/layout/LayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/LayoutEngine.h 2008-01-25 12:22:14.000000000 +0000 @@ -164,7 +164,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount=0); /** * This method does the glyph processing. It converts an array of characters diff -ru icu/source/layout/OpenTypeLayoutEngine.cpp icu.works/source/layout/OpenTypeLayoutEngine.cpp --- icu.orig/source/layout/OpenTypeLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/OpenTypeLayoutEngine.cpp 2008-01-25 12:22:32.000000000 +0000 @@ -149,7 +149,7 @@ } le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/OpenTypeLayoutEngine.h icu.works/source/layout/OpenTypeLayoutEngine.h --- icu.orig/source/layout/OpenTypeLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/OpenTypeLayoutEngine.h 2008-01-25 12:22:39.000000000 +0000 @@ -247,7 +247,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount=0); /** * This method does character to glyph mapping, and applies the GSUB table. The diff -ru icu/source/layout/TibetanLayoutEngine.cpp icu.works/source/layout/TibetanLayoutEngine.cpp --- icu.orig/source/layout/TibetanLayoutEngine.cpp 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/TibetanLayoutEngine.cpp 2008-01-25 12:22:52.000000000 +0000 @@ -48,7 +48,7 @@ // Output: characters, char indices, tags // Returns: output character count le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32) { if (LE_FAILURE(success)) { return 0; diff -ru icu/source/layout/TibetanLayoutEngine.h icu.works/source/layout/TibetanLayoutEngine.h --- icu.orig/source/layout/TibetanLayoutEngine.h 2007-12-12 18:58:06.000000000 +0000 +++ icu/source/layout/TibetanLayoutEngine.h 2008-01-25 12:22:59.000000000 +0000 @@ -120,7 +120,7 @@ * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success, le_int32 fSyllableCount=0); };