From 2df3a87d1013c38e9aa8d90b6f2a5552bf88aaf4 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Thu, 6 Sep 2012 10:50:43 +0200 Subject: Revert "Speed up QTextEngine::resolveAdditionalFormats" This reverts commit 49fbb6e14af78f751fa114c3cf986aaa607d7408 which introduced crashes e.g. in Qt Creator. Since the original change was an optimization, it is reverted in the Qt 4.8 branch since stability is the main priority there. The crash has been fixed for the corresponding Qt 5 commit. It would be an option to recommit the optimization and the crash fix to a future minor release of Qt 4. Task-number: QTBUG-27140 Change-Id: I9dc959ea252fe55a22fd90f333ccb335b3ef1311 Reviewed-by: Olivier Goffart Reviewed-by: Lars Knoll --- src/gui/text/qtextengine.cpp | 67 ++------------------------------------------ 1 file changed, 2 insertions(+), 65 deletions(-) diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index bb453d5e28..366b5bfcb2 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -2801,25 +2801,6 @@ QFixed QTextEngine::calculateTabWidth(int item, QFixed x) const return tabWidth; } -namespace { -class FormatRangeComparatorByStart { - const QList &list; -public: - FormatRangeComparatorByStart(const QList &list) : list(list) { } - bool operator()(int a, int b) { - return list.at(a).start < list.at(b).start; - } -}; -class FormatRangeComparatorByEnd { - const QList &list; -public: - FormatRangeComparatorByEnd(const QList &list) : list(list) { } - bool operator()(int a, int b) { - return list.at(a).start + list.at(a).length < list.at(b).start + list.at(b).length; - } -}; -} - void QTextEngine::resolveAdditionalFormats() const { if (!specialData || specialData->addFormats.isEmpty() @@ -2831,53 +2812,9 @@ void QTextEngine::resolveAdditionalFormats() const specialData->resolvedFormatIndices.clear(); QVector indices(layoutData->items.count()); - - - QVarLengthArray addFormatSortedByStart; - addFormatSortedByStart.reserve(specialData->addFormats.count()); - for (int i = 0; i < specialData->addFormats.count(); ++i) - addFormatSortedByStart.append(i); - QVarLengthArray addFormatSortedByEnd = addFormatSortedByStart; - qSort(addFormatSortedByStart.begin(), addFormatSortedByStart.end(), - FormatRangeComparatorByStart(specialData->addFormats)); - qSort(addFormatSortedByEnd.begin(), addFormatSortedByEnd.end(), - FormatRangeComparatorByEnd(specialData->addFormats)); - - QVarLengthArray currentFormats; - const int *startIt = addFormatSortedByStart.constBegin(); - const int *endIt = addFormatSortedByEnd.constBegin(); - for (int i = 0; i < layoutData->items.count(); ++i) { - const QScriptItem *si = &layoutData->items.at(i); - int end = si->position + length(si); - - while (startIt != addFormatSortedByStart.end() && - specialData->addFormats.at(*startIt).start <= si->position) { - currentFormats.insert(qUpperBound(currentFormats.begin(), currentFormats.end(), *startIt), - *startIt); - ++startIt; - } - while (endIt != addFormatSortedByEnd.end() && - specialData->addFormats.at(*endIt).start + specialData->addFormats.at(*endIt).length < end) { - currentFormats.remove(qBinaryFind(currentFormats, *endIt) - currentFormats.begin()); - ++endIt; - } - QTextCharFormat format; - const QTextFormatCollection *formats = 0; - if (block.docHandle()) { - formats = this->formats(); - format = formats->charFormat(formatIndex(si)); - } - foreach (int cur, currentFormats) { - const QTextLayout::FormatRange &r = specialData->addFormats.at(cur); - Q_ASSERT (r.start <= si->position && r.start + r.length >= end); - if (!specialData->addFormatIndices.isEmpty()) { - format.merge(formats->format(specialData->addFormatIndices.at(cur))); - } else { - format.merge(r.format); - } - } - indices[i] = collection->indexForFormat(format); + QTextCharFormat f = format(&layoutData->items.at(i)); + indices[i] = collection->indexForFormat(f); } specialData->resolvedFormatIndices = indices; } -- cgit v1.2.3