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:
parent
d4d47f2a04
commit
f4c3ad57b7
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user