[indic] Improve positioning of post-base bells and whistles

Bug 58714 - Kannada u+0cb0 u+200d u+0ccd u+0c95 u+0cbe does not provide
same results as Windows8
https://bugs.freedesktop.org/show_bug.cgi?id=58714

Test with U+0CB0,U+200D,U+0CCD,U+0C95,U+0CBF and tunga.ttf.

Improves some scripts.  Improves Bengali too, but numbers
are up because we produce better results than Uniscribe for some
sequences now.

New numbers:
BENGALI: 353724 out of 354188 tests passed. 464 failed (0.131004%)
DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
MALAYALAM: 1048140 out of 1048334 tests passed. 194 failed (0.0185056%)
ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
This commit is contained in:
Behdad Esfahbod 2013-10-18 18:07:11 +02:00
parent d5bd0590ae
commit ddce2d8df6
1 changed files with 10 additions and 9 deletions

View File

@ -962,18 +962,19 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
}
}
}
/* Re-attach ZWJ, ZWNJ, and halant to next char, for after-base consonants. */
/* For post-base consonants let them own anything before them
* since the last consonant or matra. */
{
unsigned int last_halant = end;
unsigned int last = base;
for (unsigned int i = base + 1; i < end; i++)
if (is_halant_or_coeng (info[i]))
last_halant = i;
else if (is_consonant (info[i])) {
for (unsigned int j = last_halant; j < i; j++)
if (info[j].indic_position() != POS_SMVD)
if (is_consonant (info[i]))
{
for (unsigned int j = last + 1; j < i; j++)
if (info[j].indic_position() < POS_SMVD)
info[j].indic_position() = info[i].indic_position();
last_halant = end;
}
last = i;
} else if (info[i].indic_category() == OT_M)
last = i;
}