summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-03-18 16:35:07 +0100
committerPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-03-25 12:17:14 +0000
commitdc62f15d799440f57954bea61e14669ff2990149 (patch)
tree95fc87c8fde366c412e926121121025f3da0d0b6
parent667f3abc50082b4f8c68bc6ddd3c896dcd2635bc (diff)
Resize backingstore properly on devicePixelRatio changes
Task-number: QTBUG-45076 Change-Id: Ib2f2408abf7bd0b6d1c8a05fbbdc665e77ea6392 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
-rw-r--r--src/plugins/platforms/xcb/qxcbbackingstore.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
index ce2329724a..5c9293c03d 100644
--- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp
+++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
@@ -310,7 +310,13 @@ void QXcbBackingStore::beginPaint(const QRegion &region)
{
if (!m_image)
return;
- const int dpr = int(m_image->image()->devicePixelRatio());
+ int dpr = int(m_image->image()->devicePixelRatio());
+ const int windowDpr = int(window()->devicePixelRatio());
+ if (windowDpr != dpr) {
+ resize(window()->size(), QRegion());
+ dpr = int(m_image->image()->devicePixelRatio());
+ }
+
QRegion xRegion = dpr == 1 ? region : QTransform::fromScale(dpr,dpr).map(region);
m_image->preparePaint(xRegion);
@@ -342,7 +348,15 @@ void QXcbBackingStore::flush(QWindow *window, const QRegion &region, const QPoin
if (!m_image || m_image->size().isEmpty())
return;
- QSize imageSize = m_image->size();
+ const int dpr = int(window->devicePixelRatio());
+
+#ifndef QT_NO_DEBUG
+ const int imageDpr = int(m_image->image()->devicePixelRatio());
+ if (dpr != imageDpr)
+ qWarning() << "QXcbBackingStore::flush() wrong devicePixelRatio for backingstore image" << dpr << imageDpr;
+#endif
+
+ QSize imageSize = m_image->size() / dpr; //because we multiply with the DPR later
QRegion clipped = region;
clipped &= QRect(0, 0, window->width(), window->height());
@@ -361,8 +375,6 @@ void QXcbBackingStore::flush(QWindow *window, const QRegion &region, const QPoin
return;
}
- const int dpr = int(window->devicePixelRatio());
-
QVector<QRect> rects = clipped.rects();
for (int i = 0; i < rects.size(); ++i) {
QRect rect = QRect(rects.at(i).topLeft() * dpr, rects.at(i).size() * dpr);
@@ -399,8 +411,7 @@ void QXcbBackingStore::resize(const QSize &size, const QRegion &)
{
const int dpr = int(window()->devicePixelRatio());
const QSize xSize = size * dpr;
-
- if (m_image && xSize == m_image->size())
+ if (m_image && xSize == m_image->size() && dpr == m_image->image()->devicePixelRatio())
return;
Q_XCB_NOOP(connection());