Replace explicit surrogate handlers by inline methods of QChar class
authorsuzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
Wed, 7 Sep 2011 09:58:54 +0000 (11:58 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 12 Sep 2011 14:03:47 +0000 (16:03 +0200)
Merge-request: 1284
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
(cherry picked from commit 50af55095afe1ba048dde357b771485ef2188778)

Change-Id: I0b1967145ad62243afc2060a6ae4ca141a9609fd
Reviewed-on: http://codereview.qt-project.org/4587
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
17 files changed:
src/corelib/codecs/qutfcodec.cpp
src/gui/kernel/qkeysequence.cpp
src/gui/text/qfontengine.cpp
src/gui/text/qfontengine_ft.cpp
src/gui/text/qfontengine_mac.mm
src/gui/text/qfontengine_qpa.cpp
src/gui/text/qfontengine_qpf.cpp
src/gui/text/qfontengine_qws.cpp
src/gui/text/qfontengine_s60.cpp
src/gui/text/qfontengine_win.cpp
src/gui/text/qfontengine_x11.cpp
src/gui/text/qfontenginedirectwrite.cpp
src/gui/text/qtextcursor.cpp
src/gui/text/qtextengine.cpp
src/gui/text/qtexthtmlparser.cpp
src/gui/widgets/qlinecontrol.cpp
src/plugins/codecs/cn/qgb18030codec.cpp

index f59f404..aaebec3 100644 (file)
@@ -90,8 +90,8 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve
     while (ch < end) {
         uint u = ch->unicode();
         if (surrogate_high >= 0) {
-            if (u >= 0xdc00 && u < 0xe000) {
-                u = (surrogate_high - 0xd800)*0x400 + (u - 0xdc00) + 0x10000;
+            if (ch->isLowSurrogate()) {
+                u = QChar::surrogateToUcs4(surrogate_high, u);
                 surrogate_high = -1;
             } else {
                 // high surrogate without low
@@ -101,13 +101,13 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve
                 surrogate_high = -1;
                 continue;
             }
-        } else if (u >= 0xdc00 && u < 0xe000) {
+        } else if (ch->isLowSurrogate()) {
             // low surrogate without high
             *cursor = replacement;
             ++ch;
             ++invalid;
             continue;
-        } else if (u >= 0xd800 && u < 0xdc00) {
+        } else if (ch->isHighSurrogate()) {
             surrogate_high = u;
             ++ch;
             continue;
index 117b72f..2350f16 100644 (file)
@@ -1381,11 +1381,11 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
     QString p;
 
     if (key && key < Qt::Key_Escape && key != Qt::Key_Space) {
-        if (key < 0x10000) {
-            p = QChar(key & 0xffff).toUpper();
+        if (!QChar::requiresSurrogates(key)) {
+            p = QChar(ushort(key)).toUpper();
         } else {
-            p = QChar((key-0x10000)/0x400+0xd800);
-            p += QChar((key-0x10000)%400+0xdc00);
+            p += QChar(QChar::highSurrogate(key));
+            p += QChar(QChar::lowSurrogate(key));
         }
     } else if (key >= Qt::Key_F1 && key <= Qt::Key_F35) {
             p = nativeText ? QShortcut::tr("F%1").arg(key - Qt::Key_F1 + 1)
@@ -1418,11 +1418,11 @@ NonSymbol:
             // Or else characters like Qt::Key_aring may not get displayed
             // (Really depends on you locale)
             if (!keyname[i].name) {
-                if (key < 0x10000) {
-                    p = QChar(key & 0xffff).toUpper();
+                if (!QChar::requiresSurrogates(key)) {
+                    p = QChar(ushort(key)).toUpper();
                 } else {
-                    p = QChar((key-0x10000)/0x400+0xd800);
-                    p += QChar((key-0x10000)%400+0xdc00);
+                    p += QChar(QChar::highSurrogate(key));
+                    p += QChar(QChar::lowSurrogate(key));
                 }
             }
         }
index a258b72..2cf0fdb 100644 (file)
@@ -1342,8 +1342,7 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
 
     int glyph_pos = 0;
     for (int i = 0; i < len; ++i) {
-        bool surrogate = (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00 && i < len-1
-                          && str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
+        bool surrogate = (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate());
 
         if (glyphs->glyphs[glyph_pos] == 0 && str[i].category() != QChar::Separator_Line) {
             QGlyphLayoutInstance tmp = glyphs->instance(glyph_pos);
index 25c7268..0755d9d 100644 (file)
@@ -1417,15 +1417,12 @@ void QFontEngineFT::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_me
 
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 bool QFontEngineFT::canRender(const QChar *string, int len)
index 9d9eaed..6186b2f 100644 (file)
@@ -257,10 +257,8 @@ static OSStatus atsuPostLayoutCallback(ATSULayoutOperationSelector selector, ATS
 #if !defined(QT_NO_DEBUG)
         int surrogates = 0;
         const QChar *str = item->string;
-        for (int i = item->from; i < item->from + item->length - 1; ++i) {
-            surrogates += (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00
-                           && str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
-        }
+        for (int i = item->from; i < item->from + item->length - 1; ++i)
+            surrogates += (str[i].isHighSurrogate() && str[i+1].isLowSurrogate());
 #endif
         for (nextCharStop = item->from; nextCharStop < item->from + item->length; ++nextCharStop)
             if (item->charAttributes[nextCharStop].charStop)
@@ -328,10 +326,8 @@ static OSStatus atsuPostLayoutCallback(ATSULayoutOperationSelector selector, ATS
             if (charOffset < item->length - 1) {
                 QChar current = item->string[item->from + charOffset];
                 QChar next = item->string[item->from + charOffset + 1];
-                if (current.unicode() >= 0xd800 && current.unicode() < 0xdc00
-                    && next.unicode() >= 0xdc00 && next.unicode() < 0xe000) {
+                if (current.isHighSurrogate() && next.isLowSurrogate())
                     item->log_clusters[charOffset + 1] = currentClusterGlyph;
-                }
             }
         }
     }
@@ -738,15 +734,12 @@ QFontEngineMac::~QFontEngineMac()
 
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 // Not used directly for shaping, only used to calculate m_averageCharWidth
index cb1e7d6..c829c2f 100644 (file)
@@ -226,15 +226,12 @@ QVariant QFontEngineQPA::extractHeaderField(const uchar *data, HeaderTag request
 
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 QFontEngineQPA::QFontEngineQPA(const QFontDef &def, const QByteArray &data)
index 4c1045e..584cdc0 100644 (file)
@@ -278,15 +278,12 @@ QList<QByteArray> QFontEngineQPF::cleanUpAfterClientCrash(const QList<int> &cras
 
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 #ifdef QT_FONTS_ARE_RESOURCES
 QFontEngineQPF::QFontEngineQPF(const QFontDef &def, const uchar *bytes, int size)
index 4c6dff2..fe2e002 100644 (file)
@@ -87,15 +87,12 @@ QT_END_INCLUDE_NAMESPACE
 
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 #define FM_SMOOTH 1
index 2bcee01..b4de066 100644 (file)
@@ -233,15 +233,12 @@ bool QSymbianTypeFaceExtras::symbianFontTableApiAvailable()
 // duplicated from qfontengine_xyz.cpp
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 extern QString qt_symbian_fontNameWithAppFontMarker(const QString &fontName); // qfontdatabase_s60.cpp
index aef2145..fc11387 100644 (file)
@@ -224,15 +224,12 @@ void QFontEngineWin::getCMap()
 
 inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 int QFontEngineWin::getGlyphIndexes(const QChar *str, int numChars, QGlyphLayout *glyphs, bool mirrored) const
index 490866c..6e87f4c 100644 (file)
@@ -358,9 +358,7 @@ bool QFontEngineXLFD::stringToCMap(const QChar *s, int len, QGlyphLayout *glyphs
     QVarLengthArray<ushort> _s(len);
     QChar *str = (QChar *)_s.data();
     for (int i = 0; i < len; ++i) {
-        if (i < len - 1
-            && s[i].unicode() >= 0xd800 && s[i].unicode() < 0xdc00
-            && s[i+1].unicode() >= 0xdc00 && s[i].unicode() < 0xe000) {
+        if (s[i].isHighSurrogate() && i < len-1 && s[i+1].isLowSurrogate()) {
             *str = QChar();
             ++i;
         } else {
index d693273..5bac117 100644 (file)
@@ -269,15 +269,12 @@ QFixed QFontEngineDirectWrite::emSquareSize() const
 
 inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
-    unsigned int uc = str[i].unicode();
-    if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
-        uint low = str[i+1].unicode();
-       if (low >= 0xdc00 && low < 0xe000) {
-            uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
-            ++i;
-        }
+    uint ucs4 = str[i].unicode();
+    if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
+        ++i;
+        ucs4 = QChar::surrogateToUcs4( ucs4, str[i].unicode());
     }
-    return uc;
+    return ucs4;
 }
 
 bool QFontEngineDirectWrite::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs,
index 8bbe86c..2bebf4c 100644 (file)
@@ -1511,11 +1511,11 @@ void QTextCursor::deletePreviousChar()
     const QTextFragmentData * const frag = fragIt.value();
     int fpos = fragIt.position();
     QChar uc = d->priv->buffer().at(d->anchor - fpos + frag->stringPosition);
-    if (d->anchor > fpos && uc.unicode() >= 0xdc00 && uc.unicode() < 0xe000) {
+    if (d->anchor > fpos && uc.isLowSurrogate()) {
         // second half of a surrogate, check if we have the first half as well,
         // if yes delete both at once
         uc = d->priv->buffer().at(d->anchor - 1 - fpos + frag->stringPosition);
-        if (uc.unicode() >= 0xd800 && uc.unicode() < 0xdc00)
+        if (uc.isHighSurrogate())
             --d->anchor;
     }
 
index 53cd2ba..7539ea7 100644 (file)
@@ -993,8 +993,7 @@ static void heuristicSetGlyphAttributes(const QChar *uc, int length, QGlyphLayou
 
     int glyph_pos = 0;
     for (int i = 0; i < length; i++) {
-        if (uc[i].unicode() >= 0xd800 && uc[i].unicode() < 0xdc00 && i < length-1
-            && uc[i+1].unicode() >= 0xdc00 && uc[i+1].unicode() < 0xe000) {
+        if (uc[i].isHighSurrogate() && i < length-1 && uc[i+1].isLowSurrogate()) {
             logClusters[i] = glyph_pos;
             logClusters[++i] = glyph_pos;
         } else {
index 5b60dfa..d130c61 100644 (file)
@@ -820,15 +820,11 @@ QString QTextHtmlParser::parseEntity()
             if (uc >= 0x80 && uc < 0x80 + (sizeof(windowsLatin1ExtendedCharacters)/sizeof(windowsLatin1ExtendedCharacters[0])))
                 uc = windowsLatin1ExtendedCharacters[uc - 0x80];
             QString str;
-            if (uc > 0xffff) {
-                // surrogate pair
-                uc -= 0x10000;
-                ushort high = uc/0x400 + 0xd800;
-                ushort low = uc%0x400 + 0xdc00;
-                str.append(QChar(high));
-                str.append(QChar(low));
+            if (QChar::requiresSurrogates(uc)) {
+                str += QChar(QChar::highSurrogate(uc));
+                str += QChar(QChar::lowSurrogate(uc));
             } else {
-                str.append(QChar(uc));
+                str = QChar(uc);
             }
             return str;
         }
index 0769bb9..79c2498 100644 (file)
@@ -217,12 +217,10 @@ void QLineControl::backspace()
             --m_cursor;
             if (m_maskData)
                 m_cursor = prevMaskBlank(m_cursor);
-            QChar uc = m_text.at(m_cursor);
-            if (m_cursor > 0 && uc.unicode() >= 0xdc00 && uc.unicode() < 0xe000) {
+            if (m_cursor > 0 && m_text.at(m_cursor).isLowSurrogate()) {
                 // second half of a surrogate, check if we have the first half as well,
                 // if yes delete both at once
-                uc = m_text.at(m_cursor - 1);
-                if (uc.unicode() >= 0xd800 && uc.unicode() < 0xdc00) {
+                if (m_text.at(m_cursor - 1).isHighSurrogate()) {
                     internalDelete(true);
                     --m_cursor;
                 }
index 0a45eeb..d12f5d9 100644 (file)
@@ -108,10 +108,10 @@ QByteArray QGb18030Codec::convertFromUnicode(const QChar *uc, int len, Converter
         int len;
         uchar buf[4];
         if (high >= 0) {
-            if (ch >= 0xdc00 && ch < 0xe000) {
+            if (uc[i].isLowSurrogate()) {
                 // valid surrogate pair
                 ++i;
-                uint u = (high-0xd800)*0x400+(ch-0xdc00)+0x10000;
+                uint u = QChar::surrogateToUcs4(high, uc[i].unicode());
                 len = qt_UnicodeToGb18030(u, buf);
                 if (len >= 2) {
                     for (int j=0; j<len; j++)
@@ -129,10 +129,10 @@ QByteArray QGb18030Codec::convertFromUnicode(const QChar *uc, int len, Converter
             }
         }
 
-        if (ch < 0x80) {
+        if (IsLatin(ch)) {
             // ASCII
             *cursor++ = ch;
-        } else if ((ch >= 0xd800 && ch < 0xdc00)) {
+        } else if (uc[i].isHighSurrogate()) {
             // surrogates area. check for correct encoding
             // we need at least one more character, first the high surrogate, then the low one
             high = ch;
@@ -181,7 +181,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta
         uchar ch = chars[i];
         switch (nbuf) {
         case 0:
-            if (ch < 0x80) {
+            if (IsLatin(ch)) {
                 // ASCII
                 resultData[unicodeLen] = ch;
                 ++unicodeLen;
@@ -339,7 +339,7 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState *
         uchar ch = chars[i];
         switch (nbuf) {
         case 0:
-            if (ch < 0x80) {
+            if (IsLatin(ch)) {
                 // ASCII
                 resultData[unicodeLen] = ch;
                 ++unicodeLen;
@@ -487,7 +487,7 @@ QString QGb2312Codec::convertToUnicode(const char* chars, int len, ConverterStat
         uchar ch = chars[i];
         switch (nbuf) {
         case 0:
-            if (ch < 0x80) {
+            if (IsLatin(ch)) {
                 // ASCII
                 resultData[unicodeLen] = ch;
                 ++unicodeLen;