From 94789fd6012125acc8426dd88df97f03b0948ea5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 26 Feb 2013 21:22:37 -0500 Subject: [PATCH] [Indic] Sort pre-base reordering consonants with post-forms Before, we were marking them as below-form for initial reordering. However, there is a rule that says "post consonants should follow below consonsnts" for base determination purposes. Malayalam has port-form YA/VA, and RA is pre-base. As such, for a sequence like YA,Virama,YA,Virama,RA, the correct base is at index 0. But because the code was seeing RA as a below-base, it was stopping at the second YA as base, instead of jumping it as a post-base. By treating prebase-reordering consonants like post-forms, this is fixed. MALAYALAM went down from 351 to 265. Other numbers didn't change: BENGALI: 353686 out of 354188 tests passed. 502 failed (0.141733%) DEVANAGARI: 707305 out of 707394 tests passed. 89 failed (0.0125814%) GUJARATI: 366262 out of 366457 tests passed. 195 failed (0.0532122%) GURMUKHI: 60706 out of 60747 tests passed. 41 failed (0.067493%) KANNADA: 950680 out of 951913 tests passed. 1233 failed (0.129529%) KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%) LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%) MALAYALAM: 1048069 out of 1048334 tests passed. 265 failed (0.0252782%) ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%) SINHALA: 271539 out of 271847 tests passed. 308 failed (0.113299%) TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%) TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%) TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%) --- src/hb-ot-shape-complex-indic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 0beddc819..644cbb150 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -550,7 +550,7 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan, hb_face_t *face) { bool zero_context = indic_plan->is_old_spec ? false : true; - if (indic_plan->pref.would_substitute (glyphs, glyphs_len, zero_context, face)) return POS_BELOW_C; + if (indic_plan->pref.would_substitute (glyphs, glyphs_len, zero_context, face)) return POS_POST_C; if (indic_plan->blwf.would_substitute (glyphs, glyphs_len, zero_context, face)) return POS_BELOW_C; if (indic_plan->pstf.would_substitute (glyphs, glyphs_len, zero_context, face)) return POS_POST_C; return POS_BASE_C;