summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qpainter.cpp
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eblomfel@trolltech.com>2009-05-18 14:07:31 (GMT)
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>2010-01-14 12:45:16 (GMT)
commit5d0f93a3d6d3d99d86d181ee3cc559a6782be4ee (patch)
tree3f8a7a1584c6dd40fb726f47cd6bd32f87967311 /src/gui/painting/qpainter.cpp
parentb6b3f7b60ac3a59bc083e38e78b087b20f003bb6 (diff)
downloadQt-5d0f93a3d6d3d99d86d181ee3cc559a6782be4ee.zip
Qt-5d0f93a3d6d3d99d86d181ee3cc559a6782be4ee.tar.gz
Qt-5d0f93a3d6d3d99d86d181ee3cc559a6782be4ee.tar.bz2
Introduce QStaticText API
Much of the time in drawText() is used on text layouting, which is wasted time when the text is not updated every frame. QStaticText is meant to cache the relevant parts of this work. It currently uses a copy-paste of the layout code in QPainter::drawText() and 99% of the time in QPainter::drawStaticText() is spent in drawTextItem(). We can use QTextLayout here instead without losing much.
Diffstat (limited to 'src/gui/painting/qpainter.cpp')
-rw-r--r--src/gui/painting/qpainter.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index a98ac10..f5bd2c5 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -69,6 +69,7 @@
#include <private/qwidget_p.h>
#include <private/qpaintengine_raster_p.h>
#include <private/qmath_p.h>
+#include <private/qstatictext_p.h>
QT_BEGIN_NAMESPACE
@@ -5703,6 +5704,37 @@ void QPainter::drawText(const QPointF &p, const QString &str)
drawText(p, str, 0, 0);
}
+void QPainter::drawStaticText(const QPointF &p, const QStaticText &staticText)
+{
+ const QStaticTextPrivate *staticText_d = QStaticTextPrivate::get(&staticText);
+ const QTextEngine &engine = staticText_d->engine;
+ const QVarLengthArray<int> &visualOrder = staticText_d->visualOrder;
+
+ QFixed x = QFixed::fromReal(p.x());
+ QFixed ox = x;
+
+ int nItems = engine.layoutData->items.size();
+ for (int i = 0; i < nItems; ++i) {
+ int item = visualOrder[i];
+ const QScriptItem &si = engine.layoutData->items.at(item);
+ if (si.analysis.flags >= QScriptAnalysis::TabOrObject) {
+ x += si.width;
+ continue;
+ }
+ QFont f = engine.font(si);
+ QTextItemInt gf(si, &f);
+ gf.glyphs = engine.shapedGlyphs(&si);
+ gf.chars = engine.layoutData->string.unicode() + si.position;
+ gf.num_chars = engine.length(item);
+ gf.width = si.width;
+ gf.logClusters = engine.logClusters(&si);
+
+ drawTextItem(QPointF(x.toReal(), p.y()), gf);
+
+ x += si.width;
+ }
+}
+
/*!
\internal
*/