Bug 492296 - [HiDPI]GC.copyArea() copies only low resolution image even
if high resolution display is used
Adds a high resolution representation for the image when on retina/high
res display. Removed version checks and code for older OSX versions.
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java
index 6ad9d79..1d2870a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java
@@ -468,10 +468,8 @@
NSSize size = imageHandle.size();
NSArray screens = null;
NSString key = null;
- if (OS.VERSION >= 0x1070) {
- screens = NSScreen.screens();
- key = NSString.stringWith("NSScreenNumber");
- }
+ screens = NSScreen.screens();
+ key = NSString.stringWith("NSScreenNumber");
CGRect rect = new CGRect();
rect.origin.x = x;
rect.origin.y = y;
@@ -486,46 +484,29 @@
OS.memmove(display, displays + (i * 4), 4);
OS.CGDisplayBounds(display[0], rect);
double /*float*/ scaling = 1;
- if (OS.VERSION >= 0x1070) {
- for (int j = 0; j < screens.count(); j++) {
- NSScreen screen = new NSScreen(screens.objectAtIndex(j));
- if (display[0] == new NSNumber(screen.deviceDescription().objectForKey(key)).intValue()) {
- scaling = screen.backingScaleFactor();
- break;
- }
+ for (int j = 0; j < screens.count(); j++) {
+ NSScreen screen = new NSScreen(screens.objectAtIndex(j));
+ if (display[0] == new NSNumber(screen.deviceDescription().objectForKey(key)).intValue()) {
+ scaling = screen.backingScaleFactor();
+ break;
}
}
+ /*
+ * Add a high resolution image representation to the image if scaling factor is > 1
+ */
+ if (scaling > 1) {
+ int width = (int) (size.width * scaling);
+ int height = (int) (size.height * scaling);
+ NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc();
+ rep = rep.initWithBitmapDataPlanes(0, width, height, 8, 3, false, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width * 4, 32);
+ OS.memset(rep.bitmapData(), 0xFF, width * height * 4);
+ imageHandle.addRepresentation(rep);
+ rep.release();
+ }
long /*int*/ srcImage = 0;
- long /*int*/ address = OS.VERSION >= 0x1070 ? 0 : OS.CGDisplayBaseAddress(display[0]);
- if (address != 0) {
- long /*int*/ width = OS.CGDisplayPixelsWide(display[0]);
- long /*int*/ height = OS.CGDisplayPixelsHigh(display[0]);
- long /*int*/ bpr = OS.CGDisplayBytesPerRow(display[0]);
- long /*int*/ bpp = OS.CGDisplayBitsPerPixel(display[0]);
- long /*int*/ bps = OS.CGDisplayBitsPerSample(display[0]);
- int bitmapInfo = OS.kCGImageAlphaNoneSkipFirst;
- switch ((int)/*63*/bpp) {
- case 16: bitmapInfo |= OS.kCGBitmapByteOrder16Host; break;
- case 32: bitmapInfo |= OS.kCGBitmapByteOrder32Host; break;
- }
- if (OS.__BIG_ENDIAN__() && OS.VERSION >= 0x1040) {
- long /*int*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- long /*int*/ context = OS.CGBitmapContextCreate(address, width, height, bps, bpr, colorspace, bitmapInfo);
- OS.CGColorSpaceRelease(colorspace);
- srcImage = OS.CGBitmapContextCreateImage(context);
- OS.CGContextRelease(context);
- } else {
- long /*int*/ provider = OS.CGDataProviderCreateWithData(0, address, bpr * height, 0);
- long /*int*/ colorspace = OS.CGColorSpaceCreateDeviceRGB();
- srcImage = OS.CGImageCreate(width, height, bps, bpp, bpr, colorspace, bitmapInfo, provider, 0, true, 0);
- OS.CGColorSpaceRelease(colorspace);
- OS.CGDataProviderRelease(provider);
- }
- } else {
- if (OS.VERSION >= 0x1060) srcImage = OS.CGDisplayCreateImage(display[0]);
- }
+ srcImage = OS.CGDisplayCreateImage(display[0]);
if (srcImage != 0) {
- copyArea(image, (int)(x * scaling - rect.origin.x), (int)(y * scaling - rect.origin.y), srcImage, scaling);
+ copyArea(image, (int)(x * scaling - rect.origin.x), (int)(y * scaling - rect.origin.y), srcImage);
OS.CGImageRelease(srcImage);
}
}
@@ -537,7 +518,7 @@
}
}
-void copyArea (Image image, int x, int y, long /*int*/ srcImage, double /*float*/ scaling) {
+void copyArea (Image image, int x, int y, long /*int*/ srcImage) {
if (srcImage == 0) return;
NSBitmapImageRep rep = image.getRepresentation();
long /*int*/ bpc = rep.bitsPerSample();
@@ -557,10 +538,10 @@
OS.CGColorSpaceRelease(colorspace);
if (context != 0) {
CGRect rect = new CGRect();
- rect.origin.x = -x / scaling;
- rect.origin.y = y / scaling;
- rect.size.width = OS.CGImageGetWidth(srcImage) / scaling;
- rect.size.height = OS.CGImageGetHeight(srcImage) / scaling;
+ rect.origin.x = -x;
+ rect.origin.y = y;
+ rect.size.width = OS.CGImageGetWidth(srcImage);
+ rect.size.height = OS.CGImageGetHeight(srcImage);
OS.CGContextTranslateCTM(context, 0, -(rect.size.height - height));
OS.CGContextDrawImage(context, rect, srcImage);
OS.CGContextRelease(context);