aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickwidgets
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@qt.io>2016-04-20 14:02:55 +0200
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-04-20 13:22:40 +0000
commited62c8f668bb0f7f17946764d510e286f111688a (patch)
tree0599b0589db6ec9d70b1dc23e5599eb0cec6c71d /src/quickwidgets
parent62198ab4485e15f350122770d5dfd8de7e59b8f9 (diff)
QQuickWidget: Partial update support with software rendering
Change-Id: I886287812c1c3cd56739e24470492adc90cfafbb Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src/quickwidgets')
-rw-r--r--src/quickwidgets/qquickwidget.cpp26
-rw-r--r--src/quickwidgets/qquickwidget.h2
-rw-r--r--src/quickwidgets/qquickwidget_p.h1
3 files changed, 22 insertions, 7 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index bd4a34fdb8..b4efe2faea 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -227,7 +227,6 @@ void QQuickWidgetPrivate::itemGeometryChanged(QQuickItem *resizeItem, const QRec
QQuickItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry);
}
-// Is never called when using the software renderer
void QQuickWidgetPrivate::render(bool needsSync)
{
if (!useSoftwareRenderer) {
@@ -272,6 +271,8 @@ void QQuickWidgetPrivate::render(bool needsSync)
if (softwareRenderer) {
softwareRenderer->setCurrentPaintDevice(&softwareImage);
renderControl->render();
+
+ updateRegion += softwareRenderer->flushRegion();
}
}
}
@@ -301,7 +302,12 @@ void QQuickWidgetPrivate::renderSceneGraph()
QWidgetPrivate::nearestGraphicsProxyWidget(q)->update();
else
#endif
- q->update(); // schedule composition
+ {
+ if (!useSoftwareRenderer)
+ q->update(); // schedule composition
+ else if (!updateRegion.isEmpty())
+ q->update(updateRegion);
+ }
}
QImage QQuickWidgetPrivate::grabFramebuffer()
@@ -418,7 +424,6 @@ QQuickWidget::QQuickWidget(QWidget *parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
- setAttribute(Qt::WA_OpaquePaintEvent, true);
d_func()->init();
}
@@ -432,7 +437,6 @@ QQuickWidget::QQuickWidget(const QUrl &source, QWidget *parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
- setAttribute(Qt::WA_OpaquePaintEvent, true);
d_func()->init();
setSource(source);
}
@@ -451,7 +455,6 @@ QQuickWidget::QQuickWidget(QQmlEngine* engine, QWidget *parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
- setAttribute(Qt::WA_OpaquePaintEvent, true);
Q_ASSERT(engine);
d_func()->init(engine);
}
@@ -1478,9 +1481,20 @@ QT_END_NAMESPACE
void QQuickWidget::paintEvent(QPaintEvent *event)
{
+ Q_UNUSED(event)
Q_D(QQuickWidget);
if (d->useSoftwareRenderer) {
QPainter painter(this);
- painter.drawImage(rect(), d->softwareImage);
+ if (d->updateRegion.isNull()) {
+ //Paint everything
+ painter.drawImage(rect(), d->softwareImage);
+ } else {
+ //Paint only the updated areas
+ for (auto targetRect : d->updateRegion.rects()) {
+ auto sourceRect = QRect(targetRect.topLeft() * devicePixelRatio(), targetRect.size() * devicePixelRatio());
+ painter.drawImage(targetRect, d->softwareImage, sourceRect);
+ }
+ d->updateRegion = QRegion();
+ }
}
}
diff --git a/src/quickwidgets/qquickwidget.h b/src/quickwidgets/qquickwidget.h
index 6e6c397c3e..56e6b01ac5 100644
--- a/src/quickwidgets/qquickwidget.h
+++ b/src/quickwidgets/qquickwidget.h
@@ -87,7 +87,7 @@ public:
QList<QQmlError> errors() const;
- QSize sizeHint() const;
+ QSize sizeHint() const override;
QSize initialSize() const;
void setFormat(const QSurfaceFormat &format);
diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h
index 12c6e739e1..5c35093c58 100644
--- a/src/quickwidgets/qquickwidget_p.h
+++ b/src/quickwidgets/qquickwidget_p.h
@@ -137,6 +137,7 @@ public:
bool useSoftwareRenderer;
QImage softwareImage;
+ QRegion updateRegion;
};
QT_END_NAMESPACE