Index: third_party/harfbuzz-ng/src/hb-unicode.cc |
diff --git a/third_party/harfbuzz-ng/src/hb-unicode.cc b/third_party/harfbuzz-ng/src/hb-unicode.cc |
index 4b285c5e1ca4ae03bd55876becf98d86293787ae..f2fbebbac2f8d4f52de4f467497371acd7961ee1 100644 |
--- a/third_party/harfbuzz-ng/src/hb-unicode.cc |
+++ b/third_party/harfbuzz-ng/src/hb-unicode.cc |
@@ -85,7 +85,6 @@ hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, |
hb_codepoint_t *ab HB_UNUSED, |
void *user_data HB_UNUSED) |
{ |
- /* TODO handle Hangul jamo here? */ |
return FALSE; |
} |
@@ -96,7 +95,6 @@ hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, |
hb_codepoint_t *b HB_UNUSED, |
void *user_data HB_UNUSED) |
{ |
- /* TODO handle Hangul jamo here? */ |
return FALSE; |
} |
@@ -271,3 +269,58 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, |
return ufuncs->func.decompose (ufuncs, ab, a, b, ufuncs->user_data.decompose); |
} |
+ |
+ |
+unsigned int |
+_hb_unicode_modified_combining_class (hb_unicode_funcs_t *ufuncs, |
+ hb_codepoint_t unicode) |
+{ |
+ int c = hb_unicode_combining_class (ufuncs, unicode); |
+ |
+ if (unlikely (hb_in_range<int> (c, 27, 33))) |
+ { |
+ /* Modify the combining-class to suit Arabic better. See: |
+ * http://unicode.org/faq/normalization.html#8 |
+ * http://unicode.org/faq/normalization.html#9 |
+ */ |
+ c = c == 33 ? 27 : c + 1; |
+ } |
+ else if (unlikely (hb_in_range<int> (c, 10, 25))) |
+ { |
+ /* The equivalent fix for Hebrew is more complex. |
+ * |
+ * We permute the "fixed-position" classes 10-25 into the order |
+ * described in the SBL Hebrew manual: |
+ * |
+ * http://www.sbl-site.org/Fonts/SBLHebrewUserManual1.5x.pdf |
+ * |
+ * (as recommended by: |
+ * http://forum.fontlab.com/archive-old-microsoft-volt-group/vista-and-diacritic-ordering-t6751.0.html) |
+ * |
+ * More details here: |
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=662055 |
+ */ |
+ static const int permuted_hebrew_classes[25 - 10 + 1] = { |
+ /* 10 sheva */ 22, |
+ /* 11 hataf segol */ 15, |
+ /* 12 hataf patah */ 16, |
+ /* 13 hataf qamats */ 17, |
+ /* 14 hiriq */ 23, |
+ /* 15 tsere */ 18, |
+ /* 16 segol */ 19, |
+ /* 17 patah */ 20, |
+ /* 18 qamats */ 21, |
+ /* 19 holam */ 14, |
+ /* 20 qubuts */ 24, |
+ /* 21 dagesh */ 12, |
+ /* 22 meteg */ 25, |
+ /* 23 rafe */ 13, |
+ /* 24 shin dot */ 10, |
+ /* 25 sin dot */ 11, |
+ }; |
+ c = permuted_hebrew_classes[c - 10]; |
+ } |
+ |
+ return c; |
+} |
+ |