QTextEngine: Support SMP code points when case changing
authorKonstantin Ritt <ritt.ks@gmail.com>
Mon, 22 Oct 2012 16:27:31 +0000 (19:27 +0300)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 25 Oct 2012 14:01:03 +0000 (16:01 +0200)
Semi-related to QTBUG-17337

Change-Id: I6b42c0f7e588bbeab27bf410fcdfa1a6f80e4ac2
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
src/gui/text/qtextengine.cpp

index 025d428..82cff6a 100644 (file)
@@ -1015,10 +1015,22 @@ void QTextEngine::shapeTextWithHarfbuzz(int item) const
             casedString.resize(entire_shaper_item.item.length);
         HB_UChar16 *uc = casedString.data();
         for (uint i = 0; i < entire_shaper_item.item.length; ++i) {
-            if(si.analysis.flags == QScriptAnalysis::Lowercase)
-                uc[i] = QChar::toLower(entire_shaper_item.string[si.position + i]);
-            else
-                uc[i] = QChar::toUpper(entire_shaper_item.string[si.position + i]);
+            uint ucs4 = entire_shaper_item.string[si.position + i];
+            if (QChar::isHighSurrogate(ucs4)) {
+                uc[i] = ucs4; // high part never changes in simple casing
+                if (i + 1 < entire_shaper_item.item.length) {
+                    ushort low = entire_shaper_item.string[si.position + i + 1];
+                    if (QChar::isLowSurrogate(low)) {
+                        ucs4 = QChar::surrogateToUcs4(ucs4, low);
+                        ucs4 = si.analysis.flags == QScriptAnalysis::Lowercase ? QChar::toLower(ucs4)
+                                                                               : QChar::toUpper(ucs4);
+                        uc[++i] = QChar::lowSurrogate(ucs4);
+                    }
+                }
+            } else {
+                uc[i] = si.analysis.flags == QScriptAnalysis::Lowercase ? QChar::toLower(ucs4)
+                                                                        : QChar::toUpper(ucs4);
+            }
         }
         entire_shaper_item.item.pos = 0;
         entire_shaper_item.string = uc;