summaryrefslogtreecommitdiffstats
path: root/src/gui/text
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2012-10-22 19:27:31 +0300
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-25 16:01:03 +0200
commit38630bc35af614ddebade70b9a44574c162ce4a9 (patch)
tree9d2cfdb1d06c49c7fe3a8215e3348eef4311d149 /src/gui/text
parentf42283669fca94ccb48cc589237379a7b6cefb49 (diff)
QTextEngine: Support SMP code points when case changing
Semi-related to QTBUG-17337 Change-Id: I6b42c0f7e588bbeab27bf410fcdfa1a6f80e4ac2 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/gui/text')
-rw-r--r--src/gui/text/qtextengine.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 025d4289aa..82cff6a043 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -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;