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>
Paul Olav Tvete 2015-03-18 16:35:07 +01:00
parent 667f3abc50
commit dc62f15d79
1 changed files with 17 additions and 6 deletions

View File

@ -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());