summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qcocoascreen.mm
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-02-23 09:27:52 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-02-23 09:27:52 +0100
commitefb46ea7ccf6fe8f89a8228bb5afe34c51901824 (patch)
treeea83ffeb690c735cbf2a9508e56a20ce2378fcc9 /src/plugins/platforms/cocoa/qcocoascreen.mm
parentcdc30acbdebdfb185df0a871537dd22411eae4f4 (diff)
parent5cfd5fd9d7ece7e1eb3c4d2be8ec342b376acf38 (diff)
Merge remote-tracking branch 'origin/5.11' into dev
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoascreen.mm')
-rw-r--r--src/plugins/platforms/cocoa/qcocoascreen.mm29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoascreen.mm b/src/plugins/platforms/cocoa/qcocoascreen.mm
index 049cecff54..c963f33270 100644
--- a/src/plugins/platforms/cocoa/qcocoascreen.mm
+++ b/src/plugins/platforms/cocoa/qcocoascreen.mm
@@ -233,25 +233,28 @@ QPixmap QCocoaScreen::grabWindow(WId window, int x, int y, int width, int height
windowSize.setHeight(windowRect.height());
}
- QPixmap windowPixmap(windowSize * devicePixelRatio());
+ const qreal dpr = devicePixelRatio();
+ QPixmap windowPixmap(windowSize * dpr);
windowPixmap.fill(Qt::transparent);
for (uint i = 0; i < displayCount; ++i) {
const CGRect bounds = CGDisplayBounds(displays[i]);
- int w = (width < 0 ? bounds.size.width : width) * devicePixelRatio();
- int h = (height < 0 ? bounds.size.height : height) * devicePixelRatio();
- QRect displayRect = QRect(x, y, w, h);
- displayRect = displayRect.translated(qRound(-bounds.origin.x), qRound(-bounds.origin.y));
- QCFType<CGImageRef> image = CGDisplayCreateImageForRect(displays[i],
- CGRectMake(displayRect.x(), displayRect.y(), displayRect.width(), displayRect.height()));
- QPixmap pix(w, h);
- pix.fill(Qt::transparent);
- CGRect rect = CGRectMake(0, 0, w, h);
- QMacCGContext ctx(&pix);
- qt_mac_drawCGImage(ctx, &rect, image);
+ // Calculate the position and size of the requested area
+ QPoint pos(qAbs(bounds.origin.x - x), qAbs(bounds.origin.y - y));
+ QSize size(qMin(pos.x() + width, qRound(bounds.size.width)),
+ qMin(pos.y() + height, qRound(bounds.size.height)));
+ pos *= dpr;
+ size *= dpr;
+
+ // Take the whole screen and crop it afterwards, because CGDisplayCreateImageForRect
+ // has a strange behavior when mixing highDPI and non-highDPI displays
+ QCFType<CGImageRef> cgImage = CGDisplayCreateImage(displays[i]);
+ const QImage image = qt_mac_toQImage(cgImage);
+
+ // Draw into windowPixmap only the requested size
QPainter painter(&windowPixmap);
- painter.drawPixmap(0, 0, pix);
+ painter.drawImage(windowPixmap.rect(), image, QRect(pos, size));
}
return windowPixmap;
}