From: Andy Shaw Date: Fri, 19 Aug 2011 11:46:51 +0000 (+0200) Subject: Fix QPixmap::grabWindow() on Mac OS X Lion X-Git-Tag: qt-v5.0.0-alpha1~3640 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=09210d15394e8d09a81b7877f3be8b3b28cb4253;p=profile%2Fivi%2Fqtbase.git Fix QPixmap::grabWindow() on Mac OS X Lion The old approach was not the recommended one and although it worked on Mac OS X 10.6 it did not work on 10.7. The new approach works correctly on 10.6 and 10.7, so the fix is applied for both versions. Task-number: QTBUG-19824 Merge-request: 1332 Reviewed-by: sroedal (cherry picked from commit aaf94776ce1034ec2b2402b9ca0e5cf7c7848b12) Change-Id: I567d7e2ed2e4b3256f3110f4110ab1342087bc43 Reviewed-on: http://codereview.qt-project.org/4583 Reviewed-by: Qt Sanity Bot Reviewed-by: Oswald Buddenhagen --- diff --git a/src/gui/image/qpixmap_mac.cpp b/src/gui/image/qpixmap_mac.cpp index bdf1f90..63b568e 100644 --- a/src/gui/image/qpixmap_mac.cpp +++ b/src/gui/image/qpixmap_mac.cpp @@ -852,6 +852,31 @@ static void qt_mac_grabDisplayRect(CGDirectDisplayID display, const QRect &displ } // Returns a pixmap containing the screen contents at rect. +static QPixmap qt_mac_grabScreenRect_10_6(const QRect &rect) +{ + const int maxDisplays = 128; // 128 displays should be enough for everyone. + CGDirectDisplayID displays[maxDisplays]; + CGDisplayCount displayCount; + const CGRect cgRect = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height()); + const CGDisplayErr err = CGGetDisplaysWithRect(cgRect, maxDisplays, displays, &displayCount); + + if (err && displayCount == 0) + return QPixmap(); + QPixmap windowPixmap(rect.size()); + for (uint i = 0; i < displayCount; ++i) { + const CGRect bounds = CGDisplayBounds(displays[i]); + // Translate to display-local coordinates + QRect displayRect = rect.translated(qRound(-bounds.origin.x), qRound(-bounds.origin.y)); + // Adjust for inverted y axis. + displayRect.moveTop(qRound(bounds.size.height) - displayRect.y() - rect.height()); + QCFType image = CGDisplayCreateImageForRect(displays[i], bounds); + QPixmap pix = QPixmap::fromMacCGImageRef(image); + QPainter painter(&windowPixmap); + painter.drawPixmap(-bounds.origin.x, -bounds.origin.y, pix); + } + return windowPixmap; +} + static QPixmap qt_mac_grabScreenRect(const QRect &rect) { if (!resolveOpenGLSymbols()) @@ -927,7 +952,8 @@ QPixmap QPixmap::grabWindow(WId window, int x, int y, int w, int h) QRect rect(globalCoord.x() + x, globalCoord.y() + y, w, h); #ifdef QT_MAC_USE_COCOA - return qt_mac_grabScreenRect(rect); + return (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6) ? + qt_mac_grabScreenRect_10_6(rect) : qt_mac_grabScreenRect(rect); #else #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_4) {