Fix high-DPI scaling of window decorations for shared memory buffers

Change-Id: I6833ab86ffdb4e37dad5108baddb7a54cfb5e9fa
Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
This commit is contained in:
Johan Klokkhammer Helsing 2016-07-08 14:46:34 +02:00 committed by Johan Helsing
parent d4d47f2a04
commit f4c3ad57b7

View File

@ -301,29 +301,37 @@ void QWaylandShmBackingStore::updateDecorations()
QPainter decorationPainter(entireSurface()); QPainter decorationPainter(entireSurface());
decorationPainter.setCompositionMode(QPainter::CompositionMode_Source); decorationPainter.setCompositionMode(QPainter::CompositionMode_Source);
QImage sourceImage = windowDecoration()->contentImage(); QImage sourceImage = windowDecoration()->contentImage();
QRect target;
qreal dp = sourceImage.devicePixelRatio();
int dpWidth = int(sourceImage.width() / dp);
int dpHeight = int(sourceImage.height() / dp);
QMatrix sourceMatrix;
sourceMatrix.scale(dp, dp);
QRect target; // needs to be in device independent pixels
//Top //Top
target.setX(0); target.setX(0);
target.setY(0); target.setY(0);
target.setWidth(sourceImage.width()); target.setWidth(dpWidth);
target.setHeight(windowDecorationMargins().top()); target.setHeight(windowDecorationMargins().top());
decorationPainter.drawImage(target, sourceImage, target); decorationPainter.drawImage(target, sourceImage, sourceMatrix.mapRect(target));
//Left //Left
target.setWidth(windowDecorationMargins().left()); target.setWidth(windowDecorationMargins().left());
target.setHeight(sourceImage.height()); target.setHeight(dpHeight);
decorationPainter.drawImage(target, sourceImage, target); decorationPainter.drawImage(target, sourceImage, sourceMatrix.mapRect(target));
//Right //Right
target.setX(sourceImage.width() - windowDecorationMargins().right()); target.setX(dpWidth - windowDecorationMargins().right());
decorationPainter.drawImage(target, sourceImage, target); target.setWidth(windowDecorationMargins().right());
decorationPainter.drawImage(target, sourceImage, sourceMatrix.mapRect(target));
//Bottom //Bottom
target.setX(0); target.setX(0);
target.setY(sourceImage.height() - windowDecorationMargins().bottom()); target.setY(dpHeight - windowDecorationMargins().bottom());
target.setWidth(sourceImage.width()); target.setWidth(dpWidth);
target.setHeight(windowDecorationMargins().bottom()); target.setHeight(windowDecorationMargins().bottom());
decorationPainter.drawImage(target, sourceImage, target); decorationPainter.drawImage(target, sourceImage, sourceMatrix.mapRect(target));
} }
QWaylandAbstractDecoration *QWaylandShmBackingStore::windowDecoration() const QWaylandAbstractDecoration *QWaylandShmBackingStore::windowDecoration() const