From fb6c3e4f31dd0943d8751c986f7112dccd604211 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Fri, 4 May 2012 19:51:00 +0300 Subject: fix composition (C/KC) of some sequences an unassigned code point should be treated like a starter code point; thus, if we have met an unassigned code point in the currently processed sequence, we should start process the next one (but we know there are no composed character for an unassigned starter -> simply skip it) This patch doesn't apply to qtbase, commit 46b78113b22428e6f8540193fcf0e00591dbd724 solved the same issue in a different way. Change-Id: I781a26024878d8b83a182b0fd4e681be2a6d9a27 Reviewed-by: Lars Knoll --- src/corelib/tools/qchar.cpp | 5 +++-- tests/auto/qchar/tst_qchar.cpp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index e5d7c82..017c0f2 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -1546,7 +1546,7 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, int from) { QString &s = *str; - if (s.length() - from < 2) + if (from < 0 || s.length() - from < 2) return; // the loop can partly ignore high Unicode as all ligatures are in the BMP @@ -1565,12 +1565,13 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, int from) const QUnicodeTables::Properties *p = qGetProp(uc); if (p->unicodeVersion == QChar::Unicode_Unassigned || p->unicodeVersion > version) { starter = -1; // to prevent starter == pos - 1 - lastCombining = 0; + lastCombining = 255; // to prevent combining > lastCombining ++pos; continue; } int combining = p->combiningClass; if (starter == pos - 1 || combining > lastCombining) { + Q_ASSERT(starter >= from); // allowed to form ligature with S QChar ligature = ligatureHelper(s.at(starter).unicode(), uc); if (ligature.unicode()) { diff --git a/tests/auto/qchar/tst_qchar.cpp b/tests/auto/qchar/tst_qchar.cpp index 2f41d74..c6df716 100644 --- a/tests/auto/qchar/tst_qchar.cpp +++ b/tests/auto/qchar/tst_qchar.cpp @@ -638,6 +638,18 @@ void tst_QChar::normalization() void tst_QChar::normalization_manual() { { + QString decomposed; + decomposed += QChar(0x41); + decomposed += QChar(0x0221); // assigned in 4.0 + decomposed += QChar(0x300); + + QVERIFY(decomposed.normalized(QString::NormalizationForm_C, QChar::Unicode_3_2) == decomposed); + + decomposed[1] = QChar(0x037f); // unassigned in 6.1 + + QVERIFY(decomposed.normalized(QString::NormalizationForm_C) == decomposed); + } + { QString composed; composed += QChar(0xc0); QString decomposed; -- cgit v0.12