| Index: third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
|
| diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
|
| index 84282bd8d4ebae90e24a1b2371b3ffecf6f66363..880aa918f895d0362b5614a1df89713309b58c46 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
|
| @@ -176,24 +176,8 @@ set_indic_properties (hb_glyph_info_t &info)
|
| * Re-assign category
|
| */
|
|
|
| -
|
| - /* The spec says U+0952 is OT_A. However, testing shows that Uniscribe
|
| - * treats a whole bunch of characters similarly.
|
| - * TESTS: For example, for U+0951:
|
| - * U+092E,U+0947,U+0952
|
| - * U+092E,U+0952,U+0947
|
| - * U+092E,U+0947,U+0951
|
| - * U+092E,U+0951,U+0947
|
| - * U+092E,U+0951,U+0952
|
| - * U+092E,U+0952,U+0951
|
| - */
|
| - if (unlikely (hb_in_ranges (u, 0x0951u, 0x0952u,
|
| - 0x1CD0u, 0x1CD2u,
|
| - 0x1CD4u, 0x1CE1u) ||
|
| - u == 0x1CF4u))
|
| - cat = OT_A;
|
| /* The following act more like the Bindus. */
|
| - else if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
|
| + if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
|
| cat = OT_SM;
|
| /* The following act like consonants. */
|
| else if (unlikely (hb_in_ranges (u, 0x0A72u, 0x0A73u,
|
| @@ -216,15 +200,12 @@ set_indic_properties (hb_glyph_info_t &info)
|
| cat = OT_Symbol;
|
| ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol);
|
| }
|
| - else if (unlikely (hb_in_range (u, 0x17CDu, 0x17D1u) ||
|
| - u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
|
| + else if (unlikely (u == 0x17DDu)) /* https://github.com/roozbehp/unicode-data/issues/2 */
|
| {
|
| - /* These are like Top Matras. */
|
| cat = OT_M;
|
| pos = POS_ABOVE_C;
|
| }
|
| else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
|
| - else if (unlikely (u == 0x17D2u)) cat = OT_Coeng; /* Khmer coeng */
|
| else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
|
| cat = OT_PLACEHOLDER;
|
| else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
|
| @@ -557,8 +538,15 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
|
| indic_plan->virama_glyph = (hb_codepoint_t) -1;
|
|
|
| /* Use zero-context would_substitute() matching for new-spec of the main
|
| - * Indic scripts, and scripts with one spec only, but not for old-specs. */
|
| - bool zero_context = !indic_plan->is_old_spec;
|
| + * Indic scripts, and scripts with one spec only, but not for old-specs.
|
| + * The new-spec for all dual-spec scripts says zero-context matching happens.
|
| + *
|
| + * However, testing with Malayalam shows that old and new spec both allow
|
| + * context. Testing with Bengali new-spec however shows that it doesn't.
|
| + * So, the heuristic here is the way it is. It should *only* be changed,
|
| + * as we discover more cases of what Windows does. DON'T TOUCH OTHERWISE.
|
| + */
|
| + bool zero_context = !indic_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM;
|
| indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context);
|
| indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
|
| indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
|
| @@ -1348,6 +1336,25 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
|
| break;
|
| }
|
| }
|
| + /* For Malayalam, skip over unformed below- (but NOT post-) forms. */
|
| + if (buffer->props.script == HB_SCRIPT_MALAYALAM)
|
| + {
|
| + for (unsigned int i = base + 1; i < end; i++)
|
| + {
|
| + while (i < end && is_joiner (info[i]))
|
| + i++;
|
| + if (i == end || !is_halant_or_coeng (info[i]))
|
| + break;
|
| + i++; /* Skip halant. */
|
| + while (i < end && is_joiner (info[i]))
|
| + i++;
|
| + if (i < end && is_consonant (info[i]) && info[i].indic_position() == POS_BELOW_C)
|
| + {
|
| + base = i;
|
| + info[base].indic_position() = POS_BASE_C;
|
| + }
|
| + }
|
| + }
|
|
|
| if (start < base && info[base].indic_position() > POS_BASE_C)
|
| base--;
|
| @@ -1806,7 +1813,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
|
| }
|
| }
|
|
|
| - return c->unicode->decompose (ab, a, b);
|
| + return (bool) c->unicode->decompose (ab, a, b);
|
| }
|
|
|
| static bool
|
| @@ -1822,7 +1829,7 @@ compose_indic (const hb_ot_shape_normalize_context_t *c,
|
| /* Composition-exclusion exceptions that we want to recompose. */
|
| if (a == 0x09AFu && b == 0x09BCu) { *ab = 0x09DFu; return true; }
|
|
|
| - return c->unicode->compose (a, b, ab);
|
| + return (bool) c->unicode->compose (a, b, ab);
|
| }
|
|
|
|
|
|
|