From 76e2668a621b03ee4da423c10afac0ceb66e6a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=AA=E0=A5=8D=E0=A4=B0=E0=A4=B5=E0=A4=BF=E0=A4=A3=20?= =?UTF-8?q?=E0=A4=B8=E0=A4=BE=E0=A4=A4=E0=A4=AA=E0=A5=81=E0=A4=A4=E0=A5=87?= Date: Mon, 11 Oct 2010 13:25:29 +0200 Subject: Fix several errors with shaping of Indic scripts 1. The opentype init feature was applied to some characters even when the character appeared inside a word. 2. Using the ZWJ to separate Ra and Halant Ya should connect the two latter characters and form a Yaphala 3. Some Oriya chars were not correctly marked as below-base form. Task-number: QTBUG-13620, QTBUG-13616, QTBUG-13542 Merge-request: 2484 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp index 4d8418b..817fb0d 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp +++ b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp @@ -37,7 +37,7 @@ static HB_Bool isLetter(HB_UChar16 ucs) FLAG(HB_Letter_Titlecase) | FLAG(HB_Letter_Modifier) | FLAG(HB_Letter_Other); - return FLAG(HB_GetUnicodeCharCategory(ucs)) & test; + return (FLAG(HB_GetUnicodeCharCategory(ucs)) & test) != 0; } static HB_Bool isMark(HB_UChar16 ucs) @@ -660,18 +660,18 @@ static const unsigned char indicPosition[0xe00-0x900] = { None, None, None, None, None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, + None, Below, Below, Below, + Below, Below, Below, Below, + Below, Below, None, Below, - None, None, None, None, - Below, None, None, None, - Below, None, None, None, + Below, Below, Below, Below, + Below, Below, Below, Below, + Below, None, Below, Below, Below, Below, Below, Post, Below, None, Below, Below, - None, None, None, None, - None, None, None, None, + None, Below, Below, Below, + Below, Below, None, None, None, None, Post, Above, Post, Below, Below, Below, @@ -1741,6 +1741,11 @@ static int indic_nextSyllableBoundary(HB_Script script, const HB_UChar16 *s, int if (state == Halant && uc[pos] == 0x200d /* ZWJ */) break; // the control character should be the last char in the item + if (state == Consonant && script == HB_Script_Bengali && uc[pos-1] == 0x09B0 && uc[pos] == 0x200d /* ZWJ */) + break; + if (state == Consonant && script == HB_Script_Kannada && uc[pos-1] == 0x0CB0 && uc[pos] == 0x200d /* ZWJ */) + break; + // Bengali and Kannada has a special exception for rendering yaphala with ra (to avoid reph) see http://www.unicode.org/faq/indic.html#15 ++pos; goto finish; case Consonant: -- cgit v0.12 From ae37a39a16c0d28d69fe9e0295ec619d899dc518 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 11 Oct 2010 13:25:31 +0200 Subject: Add some tests for Indic shaping in Harfbuzz These were added to confirm the behavior in merge request 2484. Their validity depends on the validity of the merge request. Task-number: QTBUG-13620, QTBUG-13616, QTBUG-13542 --- src/3rdparty/harfbuzz/tests/shaping/main.cpp | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/3rdparty/harfbuzz/tests/shaping/main.cpp b/src/3rdparty/harfbuzz/tests/shaping/main.cpp index 28f8e07..73760a8 100644 --- a/src/3rdparty/harfbuzz/tests/shaping/main.cpp +++ b/src/3rdparty/harfbuzz/tests/shaping/main.cpp @@ -642,6 +642,10 @@ void tst_QScriptEngine::bengali() { { 0x9f1, 0x9cd, 0x9ad, 0x0 }, { 0x191, 0x17d, 0x168, 0x0 } }, + // Ra ZWJ Halant Ya + { { 0x09b0, 0x200d, 0x09cd, 0x09af, 0x0 }, + { 0x016b, 0x01cf, 0x0 } }, + { {0}, {0} } }; @@ -749,6 +753,13 @@ void tst_QScriptEngine::bengali() { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 }, { 0x013b, 0x00e1, 0x0 } }, + // Init feature for vowel sign E should only be + // applied when it's initial character (QTBUG-13620) + { { 0x09a8, 0x09c7, 0x0 }, + { 0x0232, 0x0086, 0x0 } }, + { { 0x09a8, 0x09a8, 0x09c7, 0x0 }, + { 0x0086, 0x009b, 0x0086, 0x0 } }, + { {0}, {0} } }; @@ -847,6 +858,19 @@ void tst_QScriptEngine::oriya() { 0x177, 0x0 } }, { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0xb4d, 0xb2f, 0x0 }, { 0x176, 0x124, 0x0 } }, + + // QTBUG-13542 + { { 0x0b2c, 0x0b4d, 0x0b21, 0x0 }, + { 0x0089, 0x00fc, 0x0 } }, + { { 0x0b36, 0x0b4d, 0x0b2b, 0x0 }, + { 0x0092, 0x0105, 0x0 } }, + { { 0x0b36, 0x0b4d, 0x0b1f, 0x0 }, + { 0x0092, 0x00fa, 0x0 } }, + { { 0x0b39, 0x0b4d, 0x0b1f, 0x0 }, + { 0x0095, 0x00fa, 0x0 } }, + { { 0x0b15, 0x0b4d, 0x0b16, 0x0 }, + { 0x0073, 0x00f1, 0x0 } }, + { {0}, {0} } }; @@ -1005,6 +1029,11 @@ void tst_QScriptEngine::kannada() { 0x0036, 0x00c1, 0x0 } }, { { 0x0cb0, 0x0ccd, 0x200d, 0x0c95, 0x0 }, { 0x0050, 0x00a7, 0x0 } }, + + // Kaphala + { { 0x0cb0, 0x200d, 0x0ccd, 0x0c95, 0x0 }, + { 0x0050, 0x00a7, 0x0 } }, + { {0}, {0} } }; -- cgit v0.12