summarylogtreecommitdiffstats
path: root/malayalam-rendering.patch
blob: 97c2ad73c49ca91b7a0e89e95c7c9f66a7803553 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
Description: revert change that broke Malayam rendering
Origin: reverse patch from http://bugs.icu-project.org/trac/changeset/26090/icu/trunk/source/layout/IndicReordering.cpp
Bug: http://bugs.icu-project.org/trac/ticket/8198
Bug-RedHat: https://bugzilla.redhat.com/show_bug.cgi?id=654200
Bug-Debian: http://bugs.debian.org/591615

Index: icu-4.8.1.1/source/layout/IndicReordering.cpp
===================================================================
--- icu-4.8.1.1.orig/source/layout/IndicReordering.cpp	2011-11-09 09:56:31.211396717 -0500
+++ icu-4.8.1.1/source/layout/IndicReordering.cpp	2011-11-09 09:56:44.739396527 -0500
@@ -129,10 +129,6 @@
     le_int32    fSMIndex;
     FeatureMask fSMFeatures;
 
-    LEUnicode   fPreBaseConsonant;
-    LEUnicode   fPreBaseVirama;
-    le_int32    fPBCIndex;
-    FeatureMask fPBCFeatures;
 
     void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass)
     {
@@ -179,8 +175,7 @@
           fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fAlLakuna(0), fAlLakunaIndex(0),
           fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
           fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0),
-          fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0),
-          fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0)
+          fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0)
     {
         // nothing else to do...
     }
@@ -199,8 +194,6 @@
         
         fVMabove = fVMpost  = 0;
         fSMabove = fSMbelow = 0;
-
-        fPreBaseConsonant = fPreBaseVirama = 0;
     }
 
     void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures)
@@ -396,14 +389,6 @@
         }
     }
 
-    void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features)
-    {
-        fPBCIndex = index;
-        fPreBaseConsonant = PBConsonant;
-        fPreBaseVirama = PBVirama;
-        fPBCFeatures = features;
-    }
-
     void noteBaseConsonant()
     {
         if (fMPreFixups != NULL && fMPreOutIndex >= 0) {
@@ -483,22 +468,6 @@
         }
     }
     
-    void writePreBaseConsonant()
-    {
-        // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam.  However,
-        // it seems that almost none of the fonts for Malayalam are set up to handle this.
-        // So, we're going to force the issue here by using the rakar as defined with RA in most fonts.
-
-        if (fPreBaseConsonant == 0x0d31) { // RRA
-            fPreBaseConsonant = 0x0d30; // RA
-        }
-        
-        if (fPreBaseConsonant != 0) {
-            writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures);
-            writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures);
-        }
-    }
-
     le_int32 getOutputIndex()
     {
         return fOutIndex;
@@ -765,7 +734,6 @@
                 lastConsonant -= 1;
             }
 
-            
             IndicClassTable::CharClass charClass = CC_RESERVED;
             IndicClassTable::CharClass nextClass = CC_RESERVED;
             le_int32 baseConsonant = lastConsonant;
@@ -773,11 +741,9 @@
             le_int32 postBaseLimit = classTable->scriptFlags & SF_POST_BASE_LIMIT_MASK;
             le_bool  seenVattu = FALSE;
             le_bool  seenBelowBaseForm = FALSE;
-            le_bool  seenPreBaseForm = FALSE;
             le_bool  hasNukta = FALSE;
             le_bool  hasBelowBaseForm = FALSE;
             le_bool  hasPostBaseForm = FALSE;
-            le_bool  hasPreBaseForm = FALSE;
 
             if (postBase < markStart && classTable->isNukta(chars[postBase])) {
                 charClass = CC_NUKTA;
@@ -791,22 +757,14 @@
 
                 hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta;
                 hasPostBaseForm  = IndicClassTable::hasPostBaseForm(charClass)  && !hasNukta;
-                hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta;
 
                 if (IndicClassTable::isConsonant(charClass)) {
                     if (postBaseLimit == 0 || seenVattu ||
                         (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) ||
-                        !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) {
+                        !(hasBelowBaseForm || hasPostBaseForm)) {
                         break;
                     }
 
-                    // Note any pre-base consonants
-                    if ( baseConsonant == lastConsonant && lastConsonant > 0 && 
-                         hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) {
-                        output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2);
-                        seenPreBaseForm = TRUE;
-   
-                    }
                     // consonants with nuktas are never vattus
                     seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta;
 
@@ -839,14 +797,12 @@
             }
 
             // write any pre-base consonants
-            output.writePreBaseConsonant();
-
             le_bool supressVattu = TRUE;
 
             for (i = baseLimit; i < baseConsonant; i += 1) {
                 LEUnicode ch = chars[i];
-                // Don't put 'pstf' or 'blwf' on anything before the base consonant.
-                FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask );
+                // Don't put 'blwf' on first consonant.
+                FeatureMask features = (i == baseLimit? tagArray2 : tagArray1);
 
                 charClass = classTable->getCharClass(ch);
                 nextClass = classTable->getCharClass(chars[i + 1]);
@@ -897,7 +853,7 @@
             }
 
             // write below-base consonants
-            if (baseConsonant != lastConsonant && !seenPreBaseForm) {
+            if (baseConsonant != lastConsonant) {
                 for (i = bcSpan + 1; i < postBase; i += 1) {
                     output.writeChar(chars[i], i, tagArray1);
                 }
@@ -927,7 +883,7 @@
 
             // write post-base consonants
             // FIXME: does this put the right tags on post-base consonants?
-            if (baseConsonant != lastConsonant && !seenPreBaseForm) {
+            if (baseConsonant != lastConsonant) {
                 if (postBase <= lastConsonant) {
                     for (i = postBase; i <= lastConsonant; i += 1) {
                         output.writeChar(chars[i], i, tagArray3);
@@ -1195,7 +1151,7 @@
 }
 
 
-void IndicReordering::getDynamicProperties( DynamicProperties *, const IndicClassTable *classTable ) {
+void IndicReordering::getDynamicProperties( DynamicProperties */*dProps*/, const IndicClassTable *classTable ) {
 
 
     LEUnicode currentChar;