[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#476957: (fwd) Bug#476957: texlive-xetex: Sinhala language support



Dear Jonathan,

I know your time is rather limited, and I want to excuse myself for
asking again something from you ... we got a bug report asking for
Sinhala language support in XeTeX, together with a patch.

Could you give the patch (attached) a short glance and tell me what you
think? Ok for inclusion into the TeX Live 2007 packages for Debian? Do
you believe that it will interfer in any way with the rest?

If you have the *smallest* doubts let me know and I will leave that out
and it will be fixed with TL2008, but in case you think the attached
patch is clean I will include it in XeTeX.

Thanks and all the best

Norbert

-------------------------------------------------------------------------------
Dr. Norbert Preining <preining@logic.at>        Vienna University of Technology
Debian Developer <preining@debian.org>                         Debian TeX Group
gpg DSA: 0x09C5B094      fp: 14DF 2E6C 0307 BE6D AD76  A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
ADRIGOLE (n.)
The centrepiece of a merry-go-round on which the man with the tickets
stands unnervingly still.
			--- Douglas Adams, The Meaning of Liff
--- Begin Message ---
Package: texlive-xetex
Severity: normal
Tags: patch l10n

XeTeX is linked statically with ICU 3.4, which does not support Sinhala
language.  Here is the backport of two patches that went into ICU 3.4
and 3.6 which enables Sinhala in the OpenType rendering engine.

Upstream (0.997), which uses ICU 3.8.1, properly supports Sinhala.

Also attached is a trivial patch which makes XeTeX recognize Sinhala
language.
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicClassTables.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicClassTables.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicClassTables.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicClassTables.cpp	2008-04-20 16:02:42.000000000 +0530
@@ -186,6 +186,18 @@
     _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0D60 - 0D6F
 };
 
+static const IndicClassTable::CharClass sinhCharClasses[] =
+{
+    _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0D80 - 0D8F
+    _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D90 - 0D9F
+    _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0DA0 - 0DAF
+    _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _xx, _xx, // 0DB0 - 0DBF
+    _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _vr, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF
+    _dr, _dr, _da, _da, _db, _xx, _db, _xx, _dr, _dl, _s1, _dl, _s2, _s3, _s4, _dr, // 0DD0 - 0DDF
+    _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0DE0 - 0DEF
+    _xx, _xx, _dr, _dr, _xx                                                         // 0DF0 - 0DF4
+};
+
 //
 // Split matra tables
 //
@@ -202,6 +214,8 @@
 
 static const SplitMatra mlymSplitTable[] = {{0x0D46, 0x0D3E}, {0x0D47, 0x0D3E}, {0x0D46, 0x0D57}};
 
+static const SplitMatra sinhSplitTable[] = {{0x0DD9, 0x0DCA}, {0x0DD9, 0x0DCF}, {0x0DD9, 0x0DCF, 0x0DCA}, {0x0DD9, 0x0DDF}};
+
 //
 // Script Flags
 //
@@ -218,6 +232,7 @@
 #define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3)
 #define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3)
 #define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
+#define SINH_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
 
 //
 // Indic Class Tables
@@ -240,6 +255,8 @@
 
 static const IndicClassTable mlymClassTable = {0x0D00, 0x0D6F, 3, MLYM_SCRIPT_FLAGS, mlymCharClasses, mlymSplitTable};
 
+static const IndicClassTable sinhClassTable = {0x0D80, 0x0DF4, 4, SINH_SCRIPT_FLAGS, sinhCharClasses, sinhSplitTable};
+
 //
 // IndicClassTable addresses
 //
@@ -277,7 +294,7 @@
     NULL,            /* 'ital' (OLD-ITALIC) */
     &oryaClassTable, /* 'orya' (ORIYA) */
     NULL,            /* 'runr' (RUNIC) */
-    NULL,            /* 'sinh' (SINHALA) */
+    &sinhClassTable, /* 'sinh' (SINHALA) */
     NULL,            /* 'syrc' (SYRIAC) */
     &tamlClassTable, /* 'taml' (TAMIL) */
     &teluClassTable, /* 'telu' (TELUGU) */
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicReordering.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicReordering.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicReordering.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicReordering.cpp	2008-04-20 16:02:27.000000000 +0530
@@ -35,6 +35,9 @@
     LEUnicode fLengthMark;
     le_int32  fLengthMarkIndex;
 
+    LEUnicode fAlLakuna;
+    le_int32  fAlLakunaIndex;
+
     const LETag *fMatraTags;
     
     le_int32 fMPreOutIndex;
@@ -56,6 +59,9 @@
         if (IndicClassTable::isLengthMark(matraClass)) {
             fLengthMark = matra;
             fLengthMarkIndex = matraIndex;
+        } else if (IndicClassTable::isVirama(matraClass)) {
+            fAlLakuna = matra;
+            fAlLakunaIndex = matraIndex;
         } else {
             switch (matraClass & CF_POS_MASK) {
             case CF_POS_BEFORE:
@@ -89,8 +95,9 @@
     ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups)
         : 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), fMatraTags(NULL),
-          fMPreOutIndex(-1), fMPreFixups(mpreFixups),
+          fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0),
+          fAlLakuna(0), fAlLakunaIndex(0),
+          fMatraTags(NULL), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
           fVMabove(0), fVMpost(0), fVMIndex(0), fVMTags(NULL),
           fSMabove(0), fSMbelow(0), fSMIndex(0), fSMTags(NULL)
     {
@@ -104,7 +111,7 @@
 
     void reset()
     {
-        fMpre = fMbelow = fMabove = fMpost = fLengthMark = 0;
+        fMpre = fMbelow = fMabove = fMpost = fLengthMark = fAlLakuna = 0;
         fMPreOutIndex = -1;
         
         fVMabove = fVMpost  = 0;
@@ -205,6 +212,19 @@
         }
     }
 
+    int alLakunaExists()
+    {
+        return (fAlLakuna != 0);
+    }
+
+    // Handles Al-Lakuna in Sinhala split vowels.
+    void writeAlLakuna()
+    {
+        if (fAlLakuna != 0) {
+            writeChar(fAlLakuna, fAlLakunaIndex, fMatraTags);
+        }
+    }
+
     void writeMpre()
     {
         if (fMpre != 0) {
@@ -326,14 +346,15 @@
     { 1,  1,  1,  5,  8,  3,  2,  1,  5,  9,  5,  1,  1,  1}, //  0 - ground state
     {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  1 - exit state
     {-1,  6,  1, -1, -1, -1, -1, -1,  5,  9,  5,  5,  4, -1}, //  2 - consonant with nukta
-    {-1,  6,  1, -1, -1, -1, -1,  2,  5,  9,  5,  5,  4, -1}, //  3 - consonant
+    {-1,  6,  1, -1, -1, -1, -1,  2,  5,  9,  5,  5,  4, 11}, //  3 - consonant
     {-1, -1, -1, -1, -1,  3,  2, -1, -1, -1, -1, -1, -1,  7}, //  4 - consonant virama
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  5 - dependent vowels
     {-1, -1,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  6 - vowel mark
     {-1, -1, -1, -1, -1,  3,  2, -1, -1, -1, -1, -1, -1, -1}, //  7 - ZWJ, ZWNJ
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  4, -1}, //  8 - independent vowels that can take a virama
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, 10,  5, -1, -1}, //  9 - first part of split vowel
-    {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1,  5, -1, -1}  // 10 - second part of split vowel
+    {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1,  5, -1, -1}, // 10 - second part of split vowel
+    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  7, -1}  // 11 - <ct> <zwj>
 
 };
 
@@ -420,7 +441,10 @@
         case CC_SPLIT_VOWEL_PIECE_3:
         case CC_VOWEL_MODIFIER:
         case CC_STRESS_MARK:
-            output.writeMpre();
+            // A lone <U+0DDD> crashes ooffice without this workaround.
+            if (!output.alLakunaExists()) {
+                output.writeMpre();
+            }
 
             output.writeChar(C_DOTTED_CIRCLE, prev, &tagArray[1]);
 
@@ -442,6 +466,7 @@
             }
 
             output.writeLengthMark();
+            output.writeAlLakuna();
 
             if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {
                 output.writeVMabove();
@@ -632,6 +657,7 @@
             }
 
             output.writeLengthMark();
+            output.writeAlLakuna();
 
             // write reph
             if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LayoutEngine.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/LayoutEngine.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LayoutEngine.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/LayoutEngine.cpp	2008-04-20 16:02:27.000000000 +0530
@@ -483,6 +483,7 @@
         case guruScriptCode:
         case tamlScriptCode:
         case teluScriptCode:
+        case sinhScriptCode:
             result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
             break;
 
@@ -537,6 +538,7 @@
             case guruScriptCode:
             case tamlScriptCode:
             case teluScriptCode:
+            case sinhScriptCode:
             {
                 result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
                 break;
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LEFontInstance.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/LEFontInstance.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LEFontInstance.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/LEFontInstance.cpp	2008-04-20 16:02:27.000000000 +0530
@@ -75,7 +75,7 @@
         return 0xFFFF;
     }
 
-    if (mappedChar == 0x200C || mappedChar == 0x200D) {
+    if (mappedChar == 0x200C) {
         return 1;
     }
 
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicClassTables.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicClassTables.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicClassTables.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicClassTables.cpp	2008-04-20 16:02:42.000000000 +0530
@@ -186,6 +186,18 @@
     _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0D60 - 0D6F
 };
 
+static const IndicClassTable::CharClass sinhCharClasses[] =
+{
+    _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0D80 - 0D8F
+    _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D90 - 0D9F
+    _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0DA0 - 0DAF
+    _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _xx, _xx, // 0DB0 - 0DBF
+    _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _vr, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF
+    _dr, _dr, _da, _da, _db, _xx, _db, _xx, _dr, _dl, _s1, _dl, _s2, _s3, _s4, _dr, // 0DD0 - 0DDF
+    _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0DE0 - 0DEF
+    _xx, _xx, _dr, _dr, _xx                                                         // 0DF0 - 0DF4
+};
+
 //
 // Split matra tables
 //
@@ -202,6 +214,8 @@
 
 static const SplitMatra mlymSplitTable[] = {{0x0D46, 0x0D3E}, {0x0D47, 0x0D3E}, {0x0D46, 0x0D57}};
 
+static const SplitMatra sinhSplitTable[] = {{0x0DD9, 0x0DCA}, {0x0DD9, 0x0DCF}, {0x0DD9, 0x0DCF, 0x0DCA}, {0x0DD9, 0x0DDF}};
+
 //
 // Script Flags
 //
@@ -218,6 +232,7 @@
 #define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3)
 #define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3)
 #define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
+#define SINH_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT)
 
 //
 // Indic Class Tables
@@ -240,6 +255,8 @@
 
 static const IndicClassTable mlymClassTable = {0x0D00, 0x0D6F, 3, MLYM_SCRIPT_FLAGS, mlymCharClasses, mlymSplitTable};
 
+static const IndicClassTable sinhClassTable = {0x0D80, 0x0DF4, 4, SINH_SCRIPT_FLAGS, sinhCharClasses, sinhSplitTable};
+
 //
 // IndicClassTable addresses
 //
@@ -277,7 +294,7 @@
     NULL,            /* 'ital' (OLD-ITALIC) */
     &oryaClassTable, /* 'orya' (ORIYA) */
     NULL,            /* 'runr' (RUNIC) */
-    NULL,            /* 'sinh' (SINHALA) */
+    &sinhClassTable, /* 'sinh' (SINHALA) */
     NULL,            /* 'syrc' (SYRIAC) */
     &tamlClassTable, /* 'taml' (TAMIL) */
     &teluClassTable, /* 'telu' (TELUGU) */
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicReordering.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicReordering.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/IndicReordering.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/IndicReordering.cpp	2008-04-20 16:02:27.000000000 +0530
@@ -35,6 +35,9 @@
     LEUnicode fLengthMark;
     le_int32  fLengthMarkIndex;
 
+    LEUnicode fAlLakuna;
+    le_int32  fAlLakunaIndex;
+
     const LETag *fMatraTags;
     
     le_int32 fMPreOutIndex;
@@ -56,6 +59,9 @@
         if (IndicClassTable::isLengthMark(matraClass)) {
             fLengthMark = matra;
             fLengthMarkIndex = matraIndex;
+        } else if (IndicClassTable::isVirama(matraClass)) {
+            fAlLakuna = matra;
+            fAlLakunaIndex = matraIndex;
         } else {
             switch (matraClass & CF_POS_MASK) {
             case CF_POS_BEFORE:
@@ -89,8 +95,9 @@
     ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups)
         : 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), fMatraTags(NULL),
-          fMPreOutIndex(-1), fMPreFixups(mpreFixups),
+          fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0),
+          fAlLakuna(0), fAlLakunaIndex(0),
+          fMatraTags(NULL), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
           fVMabove(0), fVMpost(0), fVMIndex(0), fVMTags(NULL),
           fSMabove(0), fSMbelow(0), fSMIndex(0), fSMTags(NULL)
     {
@@ -104,7 +111,7 @@
 
     void reset()
     {
-        fMpre = fMbelow = fMabove = fMpost = fLengthMark = 0;
+        fMpre = fMbelow = fMabove = fMpost = fLengthMark = fAlLakuna = 0;
         fMPreOutIndex = -1;
         
         fVMabove = fVMpost  = 0;
@@ -205,6 +212,19 @@
         }
     }
 
+    int alLakunaExists()
+    {
+        return (fAlLakuna != 0);
+    }
+
+    // Handles Al-Lakuna in Sinhala split vowels.
+    void writeAlLakuna()
+    {
+        if (fAlLakuna != 0) {
+            writeChar(fAlLakuna, fAlLakunaIndex, fMatraTags);
+        }
+    }
+
     void writeMpre()
     {
         if (fMpre != 0) {
@@ -326,14 +346,15 @@
     { 1,  1,  1,  5,  8,  3,  2,  1,  5,  9,  5,  1,  1,  1}, //  0 - ground state
     {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  1 - exit state
     {-1,  6,  1, -1, -1, -1, -1, -1,  5,  9,  5,  5,  4, -1}, //  2 - consonant with nukta
-    {-1,  6,  1, -1, -1, -1, -1,  2,  5,  9,  5,  5,  4, -1}, //  3 - consonant
+    {-1,  6,  1, -1, -1, -1, -1,  2,  5,  9,  5,  5,  4, 11}, //  3 - consonant
     {-1, -1, -1, -1, -1,  3,  2, -1, -1, -1, -1, -1, -1,  7}, //  4 - consonant virama
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  5 - dependent vowels
     {-1, -1,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  6 - vowel mark
     {-1, -1, -1, -1, -1,  3,  2, -1, -1, -1, -1, -1, -1, -1}, //  7 - ZWJ, ZWNJ
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  4, -1}, //  8 - independent vowels that can take a virama
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, 10,  5, -1, -1}, //  9 - first part of split vowel
-    {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1,  5, -1, -1}  // 10 - second part of split vowel
+    {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1,  5, -1, -1}, // 10 - second part of split vowel
+    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  7, -1}  // 11 - <ct> <zwj>
 
 };
 
@@ -420,7 +441,10 @@
         case CC_SPLIT_VOWEL_PIECE_3:
         case CC_VOWEL_MODIFIER:
         case CC_STRESS_MARK:
-            output.writeMpre();
+            // A lone <U+0DDD> crashes ooffice without this workaround.
+            if (!output.alLakunaExists()) {
+                output.writeMpre();
+            }
 
             output.writeChar(C_DOTTED_CIRCLE, prev, &tagArray[1]);
 
@@ -442,6 +466,7 @@
             }
 
             output.writeLengthMark();
+            output.writeAlLakuna();
 
             if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {
                 output.writeVMabove();
@@ -632,6 +657,7 @@
             }
 
             output.writeLengthMark();
+            output.writeAlLakuna();
 
             // write reph
             if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LayoutEngine.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/LayoutEngine.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LayoutEngine.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/LayoutEngine.cpp	2008-04-20 16:02:27.000000000 +0530
@@ -483,6 +483,7 @@
         case guruScriptCode:
         case tamlScriptCode:
         case teluScriptCode:
+        case sinhScriptCode:
             result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
             break;
 
@@ -537,6 +538,7 @@
             case guruScriptCode:
             case tamlScriptCode:
             case teluScriptCode:
+            case sinhScriptCode:
             {
                 result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
                 break;
diff -Nrua texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LEFontInstance.cpp texlive-bin-2007/build/source/libs/icu-xetex/layout/LEFontInstance.cpp
--- texlive-bin-2007.orig/build/source/libs/icu-xetex/layout/LEFontInstance.cpp	2008-04-20 16:01:17.000000000 +0530
+++ texlive-bin-2007/build/source/libs/icu-xetex/layout/LEFontInstance.cpp	2008-04-20 16:02:27.000000000 +0530
@@ -75,7 +75,7 @@
         return 0xFFFF;
     }
 
-    if (mappedChar == 0x200C || mappedChar == 0x200D) {
+    if (mappedChar == 0x200C) {
         return 1;
     }
 
diff -Nrua texlive-bin-2007.orig/build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp texlive-bin-2007/build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp
--- texlive-bin-2007.orig/build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp	2008-04-20 16:01:23.000000000 +0530
+++ texlive-bin-2007/build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp	2008-04-20 16:08:41.000000000 +0530
@@ -85,6 +85,7 @@
         case guruScriptCode:
         case tamlScriptCode:
         case teluScriptCode:
+        case sinhScriptCode:
 //            result = new XeTeXIndicLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, addFeatures, removeFeatures);
             result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
             break;
@@ -125,6 +126,7 @@
 		case guruScriptCode:
 		case tamlScriptCode:
 		case teluScriptCode:
+		case sinhScriptCode:
 			result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
 			break;
 

--- End Message ---

Reply to: