From 0804477bda6bfdc3eb1ee154999ed9d23f3cfc49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20Heikkil=C3=A4?= Date: Tue, 18 Jan 2011 10:10:33 +0200 Subject: Fixes: NB#216969 - [TASK] MLabelView rendering speed is too slow RevBy: Peter Penz Details: Added data caching and precalculation based on the performance graphs in the bug report. --- src/views/mlabelview.cpp | 20 +++++++++++--------- src/views/mlabelview_p.h | 8 +++++++- src/views/mlabelview_simple.cpp | 33 +++++++++++++++++---------------- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/views/mlabelview.cpp b/src/views/mlabelview.cpp index cac920e6..885c9bf8 100644 --- a/src/views/mlabelview.cpp +++ b/src/views/mlabelview.cpp @@ -88,6 +88,8 @@ void MLabelView::applyStyle() Q_D(MLabelView); d->impl->markDirty(); d->impl->applyStyle(); + const MLabelStyle* labelStyle = d->style(); + d->paddedSize = size() - QSizeF(labelStyle->paddingLeft() + labelStyle->paddingRight(), labelStyle->paddingTop() + labelStyle->paddingBottom()); updateGeometry(); } @@ -98,13 +100,12 @@ void MLabelView::drawContents(QPainter *painter, const QStyleOptionGraphicsItem //Opacity for the label qreal oldOpacity = painter->opacity(); - if (style()->textOpacity() >= 0.0) - painter->setOpacity(d->controller->effectiveOpacity() * style()->textOpacity()); + const MLabelStyle* labelStyle = d->style(); + if (labelStyle->textOpacity() >= 0.0) + painter->setOpacity(d->controller->effectiveOpacity() * labelStyle->textOpacity()); //give size adjusted with padding to the actual implementation class - QSizeF padding(style()->paddingLeft() + style()->paddingRight(), - style()->paddingTop() + style()->paddingBottom()); - d->impl->drawContents(painter, size() - padding); + d->impl->drawContents(painter, d->paddedSize); painter->setOpacity(oldOpacity); } @@ -115,12 +116,13 @@ void MLabelView::resizeEvent(QGraphicsSceneResizeEvent *event) Q_D(MLabelView); d->impl->markDirty(); - - QSizeF padding(style()->paddingLeft() + style()->paddingRight(), - style()->paddingTop() + style()->paddingBottom()); + const MLabelStyle* labelStyle = d->style(); + QSizeF padding(labelStyle->paddingLeft() + labelStyle->paddingRight(), + labelStyle->paddingTop() + labelStyle->paddingBottom()); + d->paddedSize = event->newSize() - QSizeF(labelStyle->paddingLeft() + labelStyle->paddingRight(), labelStyle->paddingTop() + labelStyle->paddingBottom()); event->setOldSize(event->oldSize() - padding); - event->setNewSize(event->newSize() - padding); + event->setNewSize(d->paddedSize); if (d->impl->resizeEvent(event)) { updateGeometry(); diff --git a/src/views/mlabelview_p.h b/src/views/mlabelview_p.h index 9e6fb4d7..a67e1561 100644 --- a/src/views/mlabelview_p.h +++ b/src/views/mlabelview_p.h @@ -49,7 +49,7 @@ public: virtual void longPressEvent(QGestureEvent *event, QTapAndHoldGesture* gesture); virtual void orientationChangeEvent(MOrientationChangeEvent *event); virtual void applyStyle(); - void initializeStaticText(); + void initializeTextProperties(); /** * \param width Available width in pixels for the text. @@ -107,6 +107,10 @@ public: bool dirty; QStaticText staticText; QString unconstraintText; + + bool clip; + QPen pen; + QFont font; }; class MLabelViewRich : public MLabelViewSimple @@ -229,6 +233,8 @@ public: MLabelViewSimple *impl; QTextOption textOptions; + + QSizeF paddedSize; }; #endif diff --git a/src/views/mlabelview_simple.cpp b/src/views/mlabelview_simple.cpp index 85c10b5c..dc4a1311 100644 --- a/src/views/mlabelview_simple.cpp +++ b/src/views/mlabelview_simple.cpp @@ -37,7 +37,7 @@ MLabelViewSimple::MLabelViewSimple(MLabelViewPrivate *viewPrivate) : - viewPrivate(viewPrivate), preferredSize(-1, -1), textOffset(), paintingRect(), dirty(true), staticText() + viewPrivate(viewPrivate), preferredSize(-1, -1), textOffset(), paintingRect(), dirty(true), staticText(), clip(false) { staticText.setTextFormat(Qt::PlainText); } @@ -50,23 +50,15 @@ void MLabelViewSimple::drawContents(QPainter *painter, const QSizeF &size) { Q_UNUSED(size); - initializeStaticText(); + initializeTextProperties(); if (staticText.text().isEmpty() || paintingRect.isEmpty()) { return; } - const MLabelModel *model = viewPrivate->model(); - const MLabelStyle *style = viewPrivate->style(); - - painter->setPen(model->color().isValid() ? model->color() : style->color()); - painter->setFont(viewPrivate->controller->font()); + painter->setPen(pen); + painter->setFont(font); painter->setRenderHint(QPainter::TextAntialiasing); - painter->setLayoutDirection(model->textDirection()); - - const bool clip = textOffset.x() < paintingRect.x() - || textOffset.y() < paintingRect.y() - || textOffset.x() + staticText.size().width() > paintingRect.right() - || textOffset.y() + staticText.size().height() > paintingRect.bottom(); + painter->setLayoutDirection(viewPrivate->model()->textDirection()); if (clip) { painter->save(); @@ -223,7 +215,7 @@ void MLabelViewSimple::applyStyle() const_cast(viewPrivate->model())->setAlignment(viewPrivate->style()->horizontalAlignment() | viewPrivate->style()->verticalAlignment()); } -void MLabelViewSimple::initializeStaticText() +void MLabelViewSimple::initializeTextProperties() { if (!dirty) { return; @@ -247,6 +239,15 @@ void MLabelViewSimple::initializeStaticText() staticText.prepare(QTransform(), viewPrivate->controller->font()); adjustTextOffset(); + + clip = textOffset.x() < paintingRect.x() + || textOffset.y() < paintingRect.y() + || textOffset.x() + staticText.size().width() > paintingRect.right() + || textOffset.y() + staticText.size().height() > paintingRect.bottom(); + + const QColor& color = viewPrivate->model()->color(); + pen = QPen(color.isValid() ? color : style->color()); + font = QFont(viewPrivate->controller->font()); } QString MLabelViewSimple::textToRender(qreal width) const @@ -360,7 +361,7 @@ QSizeF MLabelViewSimple::sizeForWidth(qreal width) const width = -1.0; } - const_cast(this)->initializeStaticText(); + const_cast(this)->initializeTextProperties(); const bool equalWidth = (width < 0.0 && staticText.textWidth() < 0.0) || width == staticText.textWidth(); if (equalWidth && staticText.text() == unconstraintText) { @@ -373,7 +374,7 @@ QSizeF MLabelViewSimple::sizeForWidth(qreal width) const if (staticText2.text() != unconstraintText) { staticText2.setText(unconstraintText); } - staticText2.prepare(QTransform(), viewPrivate->controller->font()); + staticText2.prepare(QTransform(), font); return staticText2.size(); } -- cgit v1.2.3