summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-49.1-PATCHES/patch-82-Indic-bugfix
blob: 0a8a6ee871f5fd47ae1ddb9448c674ca0a72df2a (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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
diff -ur icu-49.1.orig/source/layout/IndicClassTables.cpp icu-49.1/source/layout/IndicClassTables.cpp
--- icu-49.1.orig/source/layout/IndicClassTables.cpp	2012-03-21 18:38:10.000000000 +0100
+++ icu-49.1/source/layout/IndicClassTables.cpp	2012-06-18 14:23:38.000000000 +0200
@@ -66,7 +66,6 @@
 // special forms... (Bengali RA?)
 #define _bb  (_ct | CF_BELOW_BASE)
 #define _pb  (_ct | CF_POST_BASE)
-#define _fb  (_ct | CF_PRE_BASE)
 #define _vt  (_bb | CF_VATTU)
 #define _rv  (_vt | CF_REPH)
 #define _rp  (_pb | CF_REPH)
@@ -198,7 +197,7 @@
     _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0D00 - 0D0F
     _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0D10 - 0D1F
     _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F
-    _fb, _fb, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F
+    _pb, _cn, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F
     _dr, _dr, _dr, _dr, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F
     _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F
     _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0D60 - 0D6F
diff -ur icu-49.1.orig/source/layout/IndicReordering.cpp icu-49.1/source/layout/IndicReordering.cpp
--- icu-49.1.orig/source/layout/IndicReordering.cpp	2012-03-21 18:38:10.000000000 +0100
+++ icu-49.1/source/layout/IndicReordering.cpp	2012-06-18 14:38:25.000000000 +0200
@@ -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;
diff -ur icu-49.1.orig/source/layout/IndicReordering.h icu-49.1/source/layout/IndicReordering.h
--- icu-49.1.orig/source/layout/IndicReordering.h	2012-03-21 18:38:08.000000000 +0100
+++ icu-49.1/source/layout/IndicReordering.h	2012-06-18 14:27:48.000000000 +0200
@@ -50,7 +50,6 @@
 #define CF_BELOW_BASE    0x10000000U
 #define CF_POST_BASE     0x08000000U
 #define CF_LENGTH_MARK   0x04000000U
-#define CF_PRE_BASE      0x02000000U
 
 #define CF_POS_BEFORE    0x00300000U
 #define CF_POS_BELOW     0x00200000U
@@ -121,7 +120,6 @@
     inline le_bool hasPostBaseForm(LEUnicode ch) const;
     inline le_bool hasBelowBaseForm(LEUnicode ch) const;
     inline le_bool hasAboveBaseForm(LEUnicode ch) const;
-    inline le_bool hasPreBaseForm(LEUnicode ch) const;
 
     inline static le_bool isVowelModifier(CharClass charClass);
     inline static le_bool isStressMark(CharClass charClass);
@@ -138,7 +136,6 @@
     inline static le_bool hasPostBaseForm(CharClass charClass);
     inline static le_bool hasBelowBaseForm(CharClass charClass);
     inline static le_bool hasAboveBaseForm(CharClass charClass);
-    inline static le_bool hasPreBaseForm(CharClass charClass);
 
     static const IndicClassTable *getScriptClassTable(le_int32 scriptCode);
 };
@@ -260,11 +257,6 @@
     return (charClass & CF_POST_BASE) != 0;
 }
 
-inline le_bool IndicClassTable::hasPreBaseForm(CharClass charClass)
-{
-    return (charClass & CF_PRE_BASE) != 0;
-}
-
 inline le_bool IndicClassTable::hasBelowBaseForm(CharClass charClass)
 {
     return (charClass & CF_BELOW_BASE) != 0;
@@ -345,11 +337,6 @@
     return hasBelowBaseForm(getCharClass(ch));
 }
 
-inline le_bool IndicClassTable::hasPreBaseForm(LEUnicode ch) const
-{
-    return hasPreBaseForm(getCharClass(ch));
-}
-
 inline le_bool IndicClassTable::hasAboveBaseForm(LEUnicode ch) const
 {
     return hasAboveBaseForm(getCharClass(ch));