From fa8b4651a141602aa9da1ebc49f4d903ebba4363 Mon Sep 17 00:00:00 2001 From: tst Date: Wed, 28 Jan 2015 13:27:48 +0100 Subject: [PATCH 1/2] Adding Retina support for QDrag actions --- .../src/plugins/platforms/cocoa/qcocoadrag.mm | 2 +- .../src/plugins/platforms/cocoa/qcocoahelpers.h | 2 +- .../src/plugins/platforms/cocoa/qcocoahelpers.mm | 26 ++++++++++++++-------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm index 67c4e3d..b85b606 100644 --- a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -146,7 +146,7 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o) NSPoint event_location = [m_lastEvent locationInWindow]; NSPoint local_point = [m_lastView convertPoint:event_location fromView:nil]; local_point.x -= m_drag->hotSpot().x(); - CGFloat flippedY = m_drag->pixmap().height() - m_drag->hotSpot().y(); + CGFloat flippedY = (m_drag->pixmap().height()/m_drag->pixmap().devicePixelRatio()) - m_drag->hotSpot().y(); local_point.y += flippedY; NSSize mouseOffset = NSMakeSize(0.0, 0.0); NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; diff --git a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h index c801d9d..32090e2 100644 --- a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h +++ b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.h @@ -69,7 +69,7 @@ inline NSMutableArray *qt_mac_QStringListToNSMutableArray(const QStringList &qst { return reinterpret_cast(qt_mac_QStringListToNSMutableArrayVoid(qstrlist)); } CGImageRef qt_mac_image_to_cgimage(const QImage &image); -NSImage *qt_mac_cgimage_to_nsimage(CGImageRef iamge); +NSImage *qt_mac_cgimage_to_nsimage(CGImageRef iamge, int devicePixelRatio = 1); NSImage *qt_mac_create_nsimage(const QPixmap &pm); NSSize qt_mac_toNSSize(const QSize &qtSize); diff --git a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm index 066b2d9..757938c 100644 --- a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm +++ b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm @@ -122,18 +122,25 @@ CGImageRef qt_mac_image_to_cgimage(const QImage &img) } -NSImage *qt_mac_cgimage_to_nsimage(CGImageRef image) +NSImage *qt_mac_cgimage_to_nsimage(CGImageRef image, int devicePixelRatio) { + if(devicePixelRatio < 1) + { + devicePixelRatio = 1; + } + QCocoaAutoReleasePool pool; NSImage *newImage = 0; - NSRect imageRect = NSMakeRect(0.0, 0.0, CGImageGetWidth(image), CGImageGetHeight(image)); + + NSRect imageRect = NSMakeRect(0.0, 0.0, CGImageGetWidth(image)/devicePixelRatio, CGImageGetHeight(image)/devicePixelRatio); + NSRect pixelRect = NSMakeRect(0.0, 0.0, CGImageGetWidth(image), CGImageGetHeight(image)); + newImage = [[NSImage alloc] initWithSize:imageRect.size]; - [newImage lockFocus]; - { - CGContextRef imageContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; - CGContextDrawImage(imageContext, *(CGRect*)&imageRect, image); - } - [newImage unlockFocus]; + + NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:image]; + [newRep setSize:pixelRect.size]; + [newImage addRepresentation:newRep]; + return newImage; } @@ -143,7 +150,8 @@ NSImage *qt_mac_create_nsimage(const QPixmap &pm) return 0; QImage image = pm.toImage(); CGImageRef cgImage = qt_mac_image_to_cgimage(image); - NSImage *nsImage = qt_mac_cgimage_to_nsimage(cgImage); + NSImage *nsImage = qt_mac_cgimage_to_nsimage(cgImage, pm.devicePixelRatio()); + CGImageRelease(cgImage); return nsImage; } -- 1.9.3 (Apple Git-50) From 59907d50244f98bd7d6b81b27c4e25df484f1787 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Wed, 28 Jan 2015 13:44:57 +0100 Subject: [PATCH 2/2] Fixing memory leaks --- .../qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm | 2 ++ .../qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm | 2 ++ 2 files changed, 4 insertions(+) diff --git a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm index b85b606..2a6755e 100644 --- a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -158,6 +158,8 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o) pasteboard:pboard source:m_lastView slideBack:YES]; + + [nsimage release]; m_drag = 0; return m_executed_drop_action; diff --git a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm index 757938c..e2cdd40 100644 --- a/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm +++ b/qt-everywhere-commercial-src/qtbase/src/plugins/platforms/cocoa/qcocoahelpers.mm @@ -140,6 +140,8 @@ NSImage *qt_mac_cgimage_to_nsimage(CGImageRef image, int devicePixelRatio) NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:image]; [newRep setSize:pixelRect.size]; [newImage addRepresentation:newRep]; + + [newRep release]; return newImage; } -- 1.9.3 (Apple Git-50)