summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2012-09-03 18:06:17 +0200
committerQt by Nokia <qt-info@nokia.com>2012-09-05 03:02:59 +0200
commit0102f34f1ebe91aaff6fb2edc83a7ebf7ffb4d1e (patch)
tree8e2b3e7fc3549e69be6d089c19692f881b20b66b /tests
parent3fe5715b9a46ba13137b21d5ea8288ac8b538268 (diff)
Optimize QTextLayout/QTextEngine usage outside of QTextDocument.
When QTextLayout is used in a QTextDocument, many code paths use special caches and thus greatly outperform the raw QTextLayout version that operates directly on a QString. This patch brings some of these optimizations also to the raw version. We now also use a QFormatCollection in such cases and enable the functionality of QTextEngine::indexAdditionalFormats() and QTextEngine::resolveAdditionalFormats(). Thanks to that, we can greatly speed up QTextEngine::format(), which now uses an amort O(1) hash table lookup instead of a O(N) linear search. The added benchmark shows a gain in the order of one magnitude: ./tst_bench_QText formattedLayout:long-many before applying the patch: 378.19 msecs per iteration (total: 37,820, iterations: 100) after applying the patch: 25.80 msecs per iteration (total: 2,580, iterations: 100) Note: This change is source-incompatible for applications using the private QTextEngine API. Task-number: QTBUG-8389 Change-Id: Ifcf7a8902a394428979ea06a6d955f886ee739c7 Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/benchmarks/gui/text/qtext/main.cpp43
1 files changed, 35 insertions, 8 deletions
diff --git a/tests/benchmarks/gui/text/qtext/main.cpp b/tests/benchmarks/gui/text/qtext/main.cpp
index 5a4745fbc7..8188a01b3e 100644
--- a/tests/benchmarks/gui/text/qtext/main.cpp
+++ b/tests/benchmarks/gui/text/qtext/main.cpp
@@ -51,6 +51,7 @@
#include <qtest.h>
Q_DECLARE_METATYPE(QTextDocument*)
+Q_DECLARE_METATYPE(QList<QTextLayout::FormatRange>)
class tst_QText: public QObject
{
@@ -80,6 +81,7 @@ private slots:
void layout_data();
void layout();
+ void formattedLayout_data();
void formattedLayout();
void paintLayoutToPixmap();
void paintLayoutToPixmap_painterFill();
@@ -328,28 +330,53 @@ void tst_QText::layout()
}
}*/
-void tst_QText::formattedLayout()
+void tst_QText::formattedLayout_data()
{
- //set up formatting
- QList<QTextLayout::FormatRange> ranges;
+ QTest::addColumn<QString>("text");
+ QTest::addColumn<QList<QTextLayout::FormatRange> >("ranges");
+
+ QTextCharFormat format;
+ format.setForeground(QColor("steelblue"));
+
{
- QTextCharFormat format;
- format.setForeground(QColor("steelblue"));
+ QList<QTextLayout::FormatRange> ranges;
QTextLayout::FormatRange formatRange;
formatRange.format = format;
formatRange.start = 0;
formatRange.length = 50;
-
ranges.append(formatRange);
+
+ QTest::newRow("short-single") << m_shortLorem << ranges;
+ }
+ {
+ QList<QTextLayout::FormatRange> ranges;
+
+ QString text = m_lorem.repeated(100);
+ const int width = 1;
+ for (int i = 0; i < text.size(); i += width) {
+ QTextLayout::FormatRange formatRange;
+ formatRange.format.setForeground(QBrush(QColor(i % 255, 255, 255)));
+ formatRange.start = i;
+ formatRange.length = width;
+ ranges.append(formatRange);
+ }
+
+ QTest::newRow("long-many") << m_shortLorem << ranges;
}
+}
- QTextLayout layout(m_shortLorem);
+void tst_QText::formattedLayout()
+{
+ QFETCH(QString, text);
+ QFETCH(QList<QTextLayout::FormatRange>, ranges);
+
+ QTextLayout layout(text);
layout.setAdditionalFormats(ranges);
setupTextLayout(&layout);
QBENCHMARK {
- QTextLayout layout(m_shortLorem);
+ QTextLayout layout(text);
layout.setAdditionalFormats(ranges);
setupTextLayout(&layout);
}