tests/benchmarks/qtext/main.cpp
branchRCL_3
changeset 5 d3bac044e0f0
parent 4 3b1da2848fc7
--- a/tests/benchmarks/qtext/main.cpp	Fri Feb 19 23:40:16 2010 +0200
+++ b/tests/benchmarks/qtext/main.cpp	Fri Mar 12 15:46:37 2010 +0200
@@ -44,11 +44,16 @@
 #include <QTextDocumentWriter>
 #include <QTextLayout>
 #include <QTextCursor>
+#include <private/qtextcontrol_p.h>
+#include <qmath.h>
 #include <QFile>
+#include <QPainter>
 #include <QBuffer>
 #include <qtest.h>
 
 #ifdef Q_OS_SYMBIAN
+// In Symbian OS test data is located in applications private dir
+// Application private dir is default serach path for files, so SRCDIR can be set to empty
 #define SRCDIR ""
 #endif
 
@@ -60,6 +65,7 @@
 public:
     tst_QText() {
         m_lorem = QString::fromLatin1("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.");
+        m_shortLorem = QString::fromLatin1("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
     }
 
 private slots:
@@ -73,8 +79,26 @@
     void odfWriting_text();
     void odfWriting_images();
 
+    void constructControl();
+    void constructDocument();
+
+    void layout();
+    void paintLayoutToPixmap();
+    void paintLayoutToPixmap_painterFill();
+
+    void document();
+    void paintDocToPixmap();
+    void paintDocToPixmap_painterFill();
+
+    void control();
+    void paintControlToPixmap();
+    void paintControlToPixmap_painterFill();
+
 private:
+    QSize setupTextLayout(QTextLayout *layout);
+
     QString m_lorem;
+    QString m_shortLorem;
 };
 
 void tst_QText::loadHtml_data()
@@ -111,7 +135,11 @@
     QTest::newRow("lorem") << m_lorem;
     QTest::newRow("short") << QString::fromLatin1("Lorem ipsum dolor sit amet");
 
+#if !defined(Q_OS_SYMBIAN)
     QFile file(QString::fromLatin1(SRCDIR) + QLatin1String("/bidi.txt"));
+#else
+    QFile file( SRCDIR "bidi.txt" );
+#endif
     QVERIFY(file.open(QFile::ReadOnly));
     QByteArray data = file.readAll();
     QVERIFY(data.count() > 1000);
@@ -199,6 +227,189 @@
     delete doc;
 }
 
+QSize tst_QText::setupTextLayout(QTextLayout *layout)
+{
+    bool wrap = true;
+    int wrapWidth = 300;
+    layout->setCacheEnabled(true);
+
+    int height = 0;
+    qreal widthUsed = 0;
+    qreal lineWidth = 0;
+
+    //set manual width
+    if (wrap)
+        lineWidth = wrapWidth;
+
+    layout->beginLayout();
+
+    while (1) {
+        QTextLine line = layout->createLine();
+        if (!line.isValid())
+            break;
+
+        if (wrap)
+            line.setLineWidth(lineWidth);
+    }
+    layout->endLayout();
+
+    for (int i = 0; i < layout->lineCount(); ++i) {
+        QTextLine line = layout->lineAt(i);
+        widthUsed = qMax(widthUsed, line.naturalTextWidth());
+        line.setPosition(QPointF(0, height));
+        height += int(line.height());
+    }
+    return QSize(qCeil(widthUsed), height);
+}
+
+void tst_QText::constructControl()
+{
+    QTextControl *control = new QTextControl;
+    delete control;
+
+    QBENCHMARK {
+        QTextControl *control = new QTextControl;
+        delete control;
+    }
+}
+
+void tst_QText::constructDocument()
+{
+    QTextDocument *doc = new QTextDocument;
+    delete doc;
+
+    QBENCHMARK {
+        QTextDocument *doc = new QTextDocument;
+        delete doc;
+    }
+}
+
+void tst_QText::layout()
+{
+    QTextLayout layout(m_shortLorem);
+    setupTextLayout(&layout);
+
+    QBENCHMARK {
+        QTextLayout layout(m_shortLorem);
+        setupTextLayout(&layout);
+    }
+}
+
+void tst_QText::paintLayoutToPixmap()
+{
+    QTextLayout layout(m_shortLorem);
+    QSize size = setupTextLayout(&layout);
+
+    QBENCHMARK {
+        QPixmap img(size);
+        img.fill(Qt::transparent);
+        QPainter p(&img);
+        layout.draw(&p, QPointF(0, 0));
+    }
+}
+
+void tst_QText::paintLayoutToPixmap_painterFill()
+{
+    QTextLayout layout(m_shortLorem);
+    QSize size = setupTextLayout(&layout);
+
+    QBENCHMARK {
+        QPixmap img(size);
+        QPainter p(&img);
+        p.setCompositionMode(QPainter::CompositionMode_Source);
+        p.fillRect(0, 0, img.width(), img.height(), Qt::transparent);
+        p.setCompositionMode(QPainter::CompositionMode_SourceOver);
+        layout.draw(&p, QPointF(0, 0));
+    }
+}
+
+void tst_QText::document()
+{
+    QTextDocument *doc = new QTextDocument;
+
+    QBENCHMARK {
+        QTextDocument *doc = new QTextDocument;
+        doc->setHtml(m_shortLorem);
+    }
+}
+
+void tst_QText::paintDocToPixmap()
+{
+    QTextDocument *doc = new QTextDocument;
+    doc->setHtml(m_shortLorem);
+    doc->setTextWidth(300);
+    QSize size = doc->size().toSize();
+
+    QBENCHMARK {
+        QPixmap img(size);
+        img.fill(Qt::transparent);
+        QPainter p(&img);
+        doc->drawContents(&p);
+    }
+}
+
+void tst_QText::paintDocToPixmap_painterFill()
+{
+    QTextDocument *doc = new QTextDocument;
+    doc->setHtml(m_shortLorem);
+    doc->setTextWidth(300);
+    QSize size = doc->size().toSize();
+
+    QBENCHMARK {
+        QPixmap img(size);
+        QPainter p(&img);
+        p.setCompositionMode(QPainter::CompositionMode_Source);
+        p.fillRect(0, 0, img.width(), img.height(), Qt::transparent);
+        p.setCompositionMode(QPainter::CompositionMode_SourceOver);
+        doc->drawContents(&p);
+    }
+}
+
+void tst_QText::control()
+{
+    QTextControl *control = new QTextControl(m_shortLorem);
+
+    QBENCHMARK {
+        QTextControl *control = new QTextControl;
+        QTextDocument *doc = control->document();
+        doc->setHtml(m_shortLorem);
+    }
+}
+
+void tst_QText::paintControlToPixmap()
+{
+    QTextControl *control = new QTextControl;
+    QTextDocument *doc = control->document();
+    doc->setHtml(m_shortLorem);
+    doc->setTextWidth(300);
+    QSize size = doc->size().toSize();
+
+    QBENCHMARK {
+        QPixmap img(size);
+        img.fill(Qt::transparent);
+        QPainter p(&img);
+        control->drawContents(&p, QRectF(QPointF(0, 0), QSizeF(size)));
+    }
+}
+
+void tst_QText::paintControlToPixmap_painterFill()
+{
+    QTextControl *control = new QTextControl;
+    QTextDocument *doc = control->document();
+    doc->setHtml(m_shortLorem);
+    doc->setTextWidth(300);
+    QSize size = doc->size().toSize();
+
+    QBENCHMARK {
+        QPixmap img(size);
+        QPainter p(&img);
+        p.setCompositionMode(QPainter::CompositionMode_Source);
+        p.fillRect(0, 0, img.width(), img.height(), Qt::transparent);
+        p.setCompositionMode(QPainter::CompositionMode_SourceOver);
+        control->drawContents(&p, QRectF(QPointF(0, 0), QSizeF(size)));
+    }
+}
+
 QTEST_MAIN(tst_QText)
 
 #include "main.moc"