Minor optimizations for QTextEngine
authorRitt Konstantin <ritt.ks@gmail.com>
Wed, 13 Jul 2011 00:41:45 +0000 (04:41 +0400)
committerQt by Nokia <qt-info@nokia.com>
Thu, 18 Aug 2011 15:59:18 +0000 (17:59 +0200)
Optimize script assignment, skip calls to QUnicodeTables::script() for
the codepoints handled explicitly.
Make the helper functions of QTextEngine::elidedText() inlined

Merge-request: 1298
Reviewed-by: yoann
(cherry picked from commit 857202824e7d6083eeb87fc52d3770f8fd82b559)

Change-Id: I1afc6405a800dbc2b5f63a2f98c63e607e3ee255
Reviewed-on: http://codereview.qt.nokia.com/2998
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
src/gui/text/qtextengine.cpp

index cca30e6..e327ac1 100644 (file)
@@ -1532,33 +1532,40 @@ void QTextEngine::itemize() const
     const ushort *e = uc + length;
     int lastScript = QUnicodeTables::Common;
     while (uc < e) {
-        int script = QUnicodeTables::script(*uc);
-        if (script == QUnicodeTables::Inherited)
-            script = lastScript;
-        analysis->flags = QScriptAnalysis::None;
-        if (*uc == QChar::ObjectReplacementCharacter) {
+        switch (*uc) {
+        case QChar::ObjectReplacementCharacter:
             if (analysis->bidiLevel % 2)
                 --analysis->bidiLevel;
             analysis->script = QUnicodeTables::Common;
             analysis->flags = QScriptAnalysis::Object;
-        } else if (*uc == QChar::LineSeparator) {
+            break;
+        case QChar::LineSeparator:
             if (analysis->bidiLevel % 2)
                 --analysis->bidiLevel;
             analysis->script = QUnicodeTables::Common;
             analysis->flags = QScriptAnalysis::LineOrParagraphSeparator;
             if (option.flags() & QTextOption::ShowLineAndParagraphSeparators)
                 *const_cast<ushort*>(uc) = 0x21B5; // visual line separator
-        } else if (*uc == 9) {
+            break;
+        case 9: // Tab
             analysis->script = QUnicodeTables::Common;
             analysis->flags = QScriptAnalysis::Tab;
             analysis->bidiLevel = control.baseLevel();
-        } else if ((*uc == 32 || *uc == QChar::Nbsp)
-                   && (option.flags() & QTextOption::ShowTabsAndSpaces)) {
-            analysis->script = QUnicodeTables::Common;
-            analysis->flags = QScriptAnalysis::Space;
-            analysis->bidiLevel = control.baseLevel();
-        } else {
-            analysis->script = script;
+            break;
+        case 32: // Space
+        case QChar::Nbsp:
+            if (option.flags() & QTextOption::ShowTabsAndSpaces) {
+                analysis->script = QUnicodeTables::Common;
+                analysis->flags = QScriptAnalysis::Space;
+                analysis->bidiLevel = control.baseLevel();
+                break;
+            }
+        // fall through
+        default:
+            int script = QUnicodeTables::script(*uc);
+            analysis->script = script == QUnicodeTables::Inherited ? lastScript : script;
+            analysis->flags = QScriptAnalysis::None;
+            break;
         }
         lastScript = analysis->script;
         ++uc;
@@ -2432,7 +2439,7 @@ void QTextEngine::indexAdditionalFormats()
    between the text that gets truncated and the ellipsis. This is important to get
    correctly shaped results for arabic text.
 */
-static bool nextCharJoins(const QString &string, int pos)
+static inline bool nextCharJoins(const QString &string, int pos)
 {
     while (pos < string.length() && string.at(pos).category() == QChar::Mark_NonSpacing)
         ++pos;
@@ -2441,13 +2448,14 @@ static bool nextCharJoins(const QString &string, int pos)
     return string.at(pos).joining() != QChar::OtherJoining;
 }
 
-static bool prevCharJoins(const QString &string, int pos)
+static inline bool prevCharJoins(const QString &string, int pos)
 {
     while (pos > 0 && string.at(pos - 1).category() == QChar::Mark_NonSpacing)
         --pos;
     if (pos == 0)
         return false;
-    return (string.at(pos - 1).joining() == QChar::Dual || string.at(pos - 1).joining() == QChar::Center);
+    QChar::Joining joining = string.at(pos - 1).joining();
+    return (joining == QChar::Dual || joining == QChar::Center);
 }
 
 QString QTextEngine::elidedText(Qt::TextElideMode mode, const QFixed &width, int flags) const