bug 728866 - pt 3 - add support for Hebrew presentation forms, excluded from canonical composition. r=smontagu
authorJonathan Kew <jfkthame@gmail.com>
Mon, 20 Feb 2012 20:39:59 +0000
changeset 88764 969493463a87c7942ac30d75c9548e547f03b976
parent 88763 2c3f7f3ace8913fa91417c4dc9c462b536a031fb
child 88765 c714722a7aad88ec64b96c59adc22de4608bd6d5
push id975
push userffxbld
push dateTue, 13 Mar 2012 21:39:16 +0000
treeherdermozilla-aurora@99faebf9dc36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssmontagu
bugs728866
milestone13.0a1
bug 728866 - pt 3 - add support for Hebrew presentation forms, excluded from canonical composition. r=smontagu
gfx/thebes/gfxHarfBuzzShaper.cpp
--- a/gfx/thebes/gfxHarfBuzzShaper.cpp
+++ b/gfx/thebes/gfxHarfBuzzShaper.cpp
@@ -695,24 +695,138 @@ HBGetCombiningClass(hb_unicode_funcs_t *
 }
 
 static unsigned int
 HBGetEastAsianWidth(hb_unicode_funcs_t *ufuncs, hb_codepoint_t aCh, void *user_data)
 {
     return gfxUnicodeProperties::GetEastAsianWidth(aCh);
 }
 
+// Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA;
+// note that some letters do not have a dagesh presForm encoded
+static const PRUnichar sDageshForms[0x05EA - 0x05D0 + 1] = {
+    0xFB30, // ALEF
+    0xFB31, // BET
+    0xFB32, // GIMEL
+    0xFB33, // DALET
+    0xFB34, // HE
+    0xFB35, // VAV
+    0xFB36, // ZAYIN
+    0, // HET
+    0xFB38, // TET
+    0xFB39, // YOD
+    0xFB3A, // FINAL KAF
+    0xFB3B, // KAF
+    0xFB3C, // LAMED
+    0, // FINAL MEM
+    0xFB3E, // MEM
+    0, // FINAL NUN
+    0xFB40, // NUN
+    0xFB41, // SAMEKH
+    0, // AYIN
+    0xFB43, // FINAL PE
+    0xFB44, // PE
+    0, // FINAL TSADI
+    0xFB46, // TSADI
+    0xFB47, // QOF
+    0xFB48, // RESH
+    0xFB49, // SHIN
+    0xFB4A // TAV
+};
+
 static hb_bool_t
 HBUnicodeCompose(hb_unicode_funcs_t *ufuncs,
                  hb_codepoint_t      a,
                  hb_codepoint_t      b,
                  hb_codepoint_t     *ab,
                  void               *user_data)
 {
-    return nsUnicodeNormalizer::Compose(a, b, ab);
+    hb_bool_t found = nsUnicodeNormalizer::Compose(a, b, ab);
+
+    if (!found && (b & 0x1fff80) == 0x0580) {
+        // special-case Hebrew presentation forms that are excluded from
+        // standard normalization, but wanted for old fonts
+        switch (b) {
+        case 0x05B4: // HIRIQ
+            if (a == 0x05D9) { // YOD
+                *ab = 0xFB1D;
+                found = true;
+            }
+            break;
+        case 0x05B7: // patah
+            if (a == 0x05F2) { // YIDDISH YOD YOD
+                *ab = 0xFB1F;
+                found = true;
+            } else if (a == 0x05D0) { // ALEF
+                *ab = 0xFB2E;
+                found = true;
+            }
+            break;
+        case 0x05B8: // QAMATS
+            if (a == 0x05D0) { // ALEF
+                *ab = 0xFB2F;
+                found = true;
+            }
+            break;
+        case 0x05B9: // HOLAM
+            if (a == 0x05D5) { // VAV
+                *ab = 0xFB4B;
+                found = true;
+            }
+            break;
+        case 0x05BC: // DAGESH
+            if (a >= 0x05D0 && a <= 0x05EA) {
+                *ab = sDageshForms[a - 0x05D0];
+                found = (*ab != 0);
+            } else if (a == 0xFB2A) { // SHIN WITH SHIN DOT
+                *ab = 0xFB2C;
+                found = true;
+            } else if (a == 0xFB2B) { // SHIN WITH SIN DOT
+                *ab = 0xFB2D;
+                found = true;
+            }
+            break;
+        case 0x05BF: // RAFE
+            switch (a) {
+            case 0x05D1: // BET
+                *ab = 0xFB4C;
+                found = true;
+                break;
+            case 0x05DB: // KAF
+                *ab = 0xFB4D;
+                found = true;
+                break;
+            case 0x05E4: // PE
+                *ab = 0xFB4E;
+                found = true;
+                break;
+            }
+            break;
+        case 0x05C1: // SHIN DOT
+            if (a == 0x05E9) { // SHIN
+                *ab = 0xFB2A;
+                found = true;
+            } else if (a == 0xFB49) { // SHIN WITH DAGESH
+                *ab = 0xFB2C;
+                found = true;
+            }
+            break;
+        case 0x05C2: // SIN DOT
+            if (a == 0x05E9) { // SHIN
+                *ab = 0xFB2B;
+                found = true;
+            } else if (a == 0xFB49) { // SHIN WITH DAGESH
+                *ab = 0xFB2D;
+                found = true;
+            }
+            break;
+        }
+    }
+
+    return found;
 }
 
 static hb_bool_t
 HBUnicodeDecompose(hb_unicode_funcs_t *ufuncs,
                    hb_codepoint_t      ab,
                    hb_codepoint_t     *a,
                    hb_codepoint_t     *b,
                    void               *user_data)