diff options
author | Eskil Abrahamsen Blomfeldt <eblomfel@trolltech.com> | 2009-05-18 14:07:31 (GMT) |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> | 2010-01-14 12:45:16 (GMT) |
commit | 5d0f93a3d6d3d99d86d181ee3cc559a6782be4ee (patch) | |
tree | 3f8a7a1584c6dd40fb726f47cd6bd32f87967311 /src/gui/painting/qpainter.cpp | |
parent | b6b3f7b60ac3a59bc083e38e78b087b20f003bb6 (diff) | |
download | Qt-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.cpp | 32 |
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 */ |