diff --git a/icu.icu5431.malayam.patch b/icu.icu5431.malayam.patch index b2910af..48a549d 100644 --- a/icu.icu5431.malayam.patch +++ b/icu.icu5431.malayam.patch @@ -57,7 +57,7 @@ static const FeatureMap featureMap[] = { {loclFeatureTag, loclFeatureMask}, -@@ -629,6 +651,20 @@ +@@ -629,6 +651,21 @@ output.writeChar(chars[i], i, tagArray4); } @@ -68,11 +68,12 @@ + (chars[baseConsonant] == 0x0d30)) && + ((chars[baseConsonant - 2] >= 0x0d15) && + (chars[baseConsonant - 2] <= 0x0d39))) { ++ if (baseConsonant < 3 || chars[baseConsonant - 3] != 0x0d4d) { ++ output.swapChars(-1, -3); + -+ output.swapChars(-1, -3); -+ -+ if (mpreFixups) -+ mpreFixups->reduce(); ++ if (mpreFixups) ++ mpreFixups->reduce(); ++ } + } + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) { diff --git a/icu.icuXXXX.malayalam.bysyllable.patch b/icu.icuXXXX.malayalam.bysyllable.patch new file mode 100644 index 0000000..ff89218 --- /dev/null +++ b/icu.icuXXXX.malayalam.bysyllable.patch @@ -0,0 +1,245 @@ +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; ++ 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); ++ ++ 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 --git a/icu.spec b/icu.spec index 3a49fd4..ffb90c4 100644 --- a/icu.spec +++ b/icu.spec @@ -1,6 +1,6 @@ Name: icu Version: 3.6 -Release: 18%{?dist} +Release: 19%{?dist} Summary: International Components for Unicode Group: System Environment/Libraries License: MIT @@ -23,6 +23,7 @@ Patch11: icu.icu5501.sinhala.biggerexpand.patch Patch12: icu.icu5557.safety.patch Patch13: icu.icu5506.multiplevowels.patch Patch14: icu.icu5594.gujarati.patch +Patch15: icu.icuXXXX.malayalam.bysyllable.patch %description The International Components for Unicode (ICU) libraries provide @@ -73,7 +74,7 @@ Group: Documentation %patch11 -p1 -b .icu5501.sinhala.biggerexpand.patch %patch12 -p1 -b .icu5557.safety.patch %patch13 -p1 -b .icu5506.multiplevowels.patch -%patch14 -p1 -b .icu5594.gujarati.patch +%patch15 -p1 -b .icuXXXX.malayalam.bysyllable.patch %build cd source @@ -150,6 +151,9 @@ rm -rf $RPM_BUILD_ROOT %doc source/__docs/%{name}/html/* %changelog +* Mon Apr 30 2007 Caolan McNamara - 3.6-19 +- Resolves: rhbz#220867 Malayalam rendering + * Tue Feb 13 2007 Caolan McNamara - 3.6-18 - Resolves: rhbz#228457 icu.icu5594.gujarati.patch