X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca9eebc34612c8bc3cdb8530ea355caf3eff5df0..da6f998486f1070e205f2e0a54f22a1b67cb32a4:/src/osx/carbon/utilscocoa.mm diff --git a/src/osx/carbon/utilscocoa.mm b/src/osx/carbon/utilscocoa.mm index 41bda29155..000f6710a4 100644 --- a/src/osx/carbon/utilscocoa.mm +++ b/src/osx/carbon/utilscocoa.mm @@ -1,16 +1,19 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/osx/carbon/utils.mm +// Name: src/osx/carbon/utilscocoa.mm // Purpose: various cocoa mixin utility functions // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utilscocoa.mm 48805 2007-09-19 14:52:25Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" +#ifndef WX_PRECOMP +#include "wx/object.h" +#endif + #if wxOSX_USE_COCOA_OR_CARBON #include #else @@ -189,7 +192,7 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) } static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } -static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, tan(DegToRad(11)), 1, 0, 0 }; +static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, static_cast(tan(DegToRad(11))), 1, 0, 0 }; WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) { @@ -339,6 +342,19 @@ WX_UIFont wxFont::OSXCreateUIFont(const wxNativeFontInfo* info) return uiFont; } +#endif + +// ---------------------------------------------------------------------------- +// NSWindow Utils +// ---------------------------------------------------------------------------- + +#if wxOSX_USE_COCOA + +WXWindow wxOSXGetMainWindow() +{ + return [NSApp mainWindow]; +} + #endif // ---------------------------------------------------------------------------- // NSImage Utils @@ -355,7 +371,7 @@ WX_UIImage wxOSXGetUIImageFromCGImage( CGImageRef image ) wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &client, const wxSize& size) { -#if 0 +#if 1 // unfortunately this only accesses images in the app bundle, not the system wide globals wxCFStringRef cfname(name); return wxBitmap( [[UIImage imageNamed:cfname.AsNSString()] CGImage] ); @@ -364,25 +380,51 @@ wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &client, c #endif } +double wxOSXGetMainScreenContentScaleFactor() +{ + double scale; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 + if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) + { + scale=[[UIScreen mainScreen] scale]; + } + else +#endif + { + scale=1.0; + } + + return scale; +} + +#endif + +#if wxOSX_USE_CARBON + +double wxOSXGetMainScreenContentScaleFactor() +{ + return 1.0; +} + #endif #if wxOSX_USE_COCOA -wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &client, const wxSize& size) +wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &WXUNUSED(client), const wxSize& WXUNUSED(size)) { wxCFStringRef cfname(name); - wxCFRef image( wxOSXCreateCGImageFromNSImage([NSImage imageNamed:cfname.AsNSString()]) ); - return wxBitmap( image ); + return wxBitmap( [NSImage imageNamed:cfname.AsNSString()] ); } // From "Cocoa Drawing Guide:Working with Images" -WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image ) +WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image, double scaleFactor ) { NSRect imageRect = NSMakeRect(0.0, 0.0, 0.0, 0.0); // Get the image dimensions. - imageRect.size.height = CGImageGetHeight(image); - imageRect.size.width = CGImageGetWidth(image); + imageRect.size.height = CGImageGetHeight(image)/scaleFactor; + imageRect.size.width = CGImageGetWidth(image)/scaleFactor; // Create a new image to receive the Quartz image data. NSImage *newImage = [[NSImage alloc] initWithSize:imageRect.size]; @@ -405,22 +447,60 @@ WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image ) return( newImage ); } -CGImageRef wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage ) +CGContextRef WXDLLIMPEXP_CORE wxOSXCreateBitmapContextFromNSImage( WX_NSImage nsimage) { // based on http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg18065.html - NSSize imageSize = [nsimage size]; - CGColorSpaceRef genericRGB = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); - CGContextRef context = CGBitmapContextCreate(NULL, imageSize.width, imageSize.height, 8, 0, genericRGB, kCGImageAlphaPremultipliedFirst); - NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; - [NSGraphicsContext saveGraphicsState]; - [NSGraphicsContext setCurrentContext:nsGraphicsContext]; - [[NSColor whiteColor] setFill]; - NSRectFill(NSMakeRect(0.0, 0.0, imageSize.width, imageSize.height)); - [nsimage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; - [NSGraphicsContext setCurrentContext:nsGraphicsContext]; - CGImageRef image = CGBitmapContextCreateImage(context); - CFRelease(context); + CGContextRef hbitmap = NULL; + if (nsimage != nil) + { + double scale = wxOSXGetMainScreenContentScaleFactor(); + + NSSize imageSize = [nsimage size]; + + hbitmap = CGBitmapContextCreate(NULL, imageSize.width*scale, imageSize.height*scale, 8, 0, wxMacGetGenericRGBColorSpace(), kCGImageAlphaPremultipliedFirst); + CGContextScaleCTM( hbitmap, scale, scale ); + + NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:hbitmap flipped:NO]; + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:nsGraphicsContext]; + [[NSColor whiteColor] setFill]; + NSRectFill(NSMakeRect(0.0, 0.0, imageSize.width, imageSize.height)); + [nsimage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; + [NSGraphicsContext setCurrentContext:nsGraphicsContext]; + } + return hbitmap; +} + +double wxOSXGetMainScreenContentScaleFactor() +{ +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) + if ( [ [NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)] ) + return [[NSScreen mainScreen] backingScaleFactor]; + else +#endif + return 1.0; +} + +CGImageRef wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage, double *scaleptr ) +{ + // based on http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg18065.html + + CGImageRef image = NULL; + if (nsimage != nil) + { + CGContextRef context = wxOSXCreateBitmapContextFromNSImage(nsimage); + if ( scaleptr ) + { + // determine content scale + CGRect userrect = CGRectMake(0, 0, 10, 10); + CGRect devicerect; + devicerect = CGContextConvertRectToDeviceSpace(context, userrect); + *scaleptr = devicerect.size.height / userrect.size.height; + } + image = CGBitmapContextCreateImage(context); + CFRelease(context); + } return image; } @@ -512,8 +592,11 @@ WX_NSCursor wxMacCocoaCreateStockCursor( int cursor_type ) case wxCURSOR_WATCH: case wxCURSOR_WAIT: - // should be displayed by the system when things are running - cursor = [[NSCursor arrowCursor] retain]; + // an arrow should be displayed by the system when things are running + // according to the HIG + // cursor = [[NSCursor arrowCursor] retain]; + // but for crossplatform compatibility we display a watch cursor + cursor = wxGetStockCursor(kwxCursorWatch); break; case wxCURSOR_IBEAM: