X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03c281617c54994698a74ee7a096cb5d1e03626f..8ba4faba4de4af7613911d83263b9470e5bb1207:/src/osx/carbon/utilscocoa.mm diff --git a/src/osx/carbon/utilscocoa.mm b/src/osx/carbon/utilscocoa.mm index c46711cec4..dc4248f3c7 100644 --- a/src/osx/carbon/utilscocoa.mm +++ b/src/osx/carbon/utilscocoa.mm @@ -1,10 +1,10 @@ ///////////////////////////////////////////////////////////////////////////// -// 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 $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -188,6 +188,9 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) return nsfont; } +static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } +static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, tan(DegToRad(11)), 1, 0, 0 }; + WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) { NSFont* nsFont; @@ -206,7 +209,67 @@ WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) nsFont = [[NSFontManager sharedFontManager] fontWithFamily:wxCFStringRef(info->m_faceName).AsNSString() traits:traits weight:weight size:info->m_pointSize]; - + + if ( nsFont == nil ) + { + NSFontTraitMask remainingTraits = traits; + nsFont = [[NSFontManager sharedFontManager] fontWithFamily:wxCFStringRef(info->m_faceName).AsNSString() + traits:0 weight:5 size:info->m_pointSize]; + if ( nsFont == nil ) + { + if ( info->m_weight == wxFONTWEIGHT_BOLD ) + { + nsFont = [NSFont boldSystemFontOfSize:info->m_pointSize]; + remainingTraits &= ~NSBoldFontMask; + } + else + nsFont = [NSFont systemFontOfSize:info->m_pointSize]; + } + + // fallback - if in doubt, let go of the bold attribute + if ( nsFont && (remainingTraits & NSItalicFontMask) ) + { + NSFont* nsFontWithTraits = nil; + if ( remainingTraits & NSBoldFontMask) + { + nsFontWithTraits = [[NSFontManager sharedFontManager] convertFont:nsFont toHaveTrait:NSBoldFontMask]; + if ( nsFontWithTraits == nil ) + { + nsFontWithTraits = [[NSFontManager sharedFontManager] convertFont:nsFont toHaveTrait:NSItalicFontMask]; + if ( nsFontWithTraits != nil ) + remainingTraits &= ~NSItalicFontMask; + } + else + { + remainingTraits &= ~NSBoldFontMask; + } + } + // the code below causes crashes, because fontDescriptorWithMatrix is not returning a valid font descriptor + // it adds a NSCTFontMatrixAttribute as well which cannot be disposed of correctly by the autorelease pool + // so at the moment we have to disable this and cannot synthesize italic fonts if they are not available on the system +#if 0 + if ( remainingTraits & NSItalicFontMask ) + { + if ( nsFontWithTraits == nil ) + nsFontWithTraits = nsFont; + + NSAffineTransform* transform = [NSAffineTransform transform]; + [transform setTransformStruct:kSlantNSTransformStruct]; + [transform scaleBy:info->m_pointSize]; + NSFontDescriptor* italicDesc = [[nsFontWithTraits fontDescriptor] fontDescriptorWithMatrix:transform]; + if ( italicDesc != nil ) + { + NSFont* f = [NSFont fontWithDescriptor:italicDesc size:(CGFloat)(info->m_pointSize)]; + if ( f != nil ) + nsFontWithTraits = f; + } + } +#endif + if ( nsFontWithTraits != nil ) + nsFont = nsFontWithTraits; + } + } + wxASSERT_MSG(nsFont != nil,wxT("Couldn't create nsFont")) ; wxMacCocoaRetain(nsFont); return nsFont; @@ -283,19 +346,37 @@ WX_UIFont wxFont::OSXCreateUIFont(const wxNativeFontInfo* info) #if wxOSX_USE_IPHONE -WX_UIImage wxOSXCreateUIImageFromCGImage( CGImageRef image ) +WX_UIImage wxOSXGetUIImageFromCGImage( CGImageRef image ) { UIImage *newImage = [UIImage imageWithCGImage:image]; [newImage autorelease]; return( newImage ); } +wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &client, const wxSize& size) +{ +#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] ); +#else + return wxBitmap(); +#endif +} + #endif #if wxOSX_USE_COCOA +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 ); +} + // From "Cocoa Drawing Guide:Working with Images" -WX_NSImage wxOSXCreateNSImageFromCGImage( CGImageRef image ) +WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image ) { NSRect imageRect = NSMakeRect(0.0, 0.0, 0.0, 0.0); @@ -327,19 +408,22 @@ WX_NSImage wxOSXCreateNSImageFromCGImage( CGImageRef image ) CGImageRef wxOSXCreateCGImageFromNSImage( 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); + + CGImageRef image = NULL; + if (nsimage != nil) + { + NSSize imageSize = [nsimage size]; + CGContextRef context = CGBitmapContextCreate(NULL, imageSize.width, imageSize.height, 8, 0, wxMacGetGenericRGBColorSpace(), 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]; + image = CGBitmapContextCreateImage(context); + CFRelease(context); + } return image; } @@ -431,8 +515,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: @@ -543,11 +630,9 @@ WX_NSCursor wxMacCocoaCreateCursorFromCGImage( CGImageRef cgImageRef, float hot firstTime = NO; } - NSImage *nsImage = wxOSXCreateNSImageFromCGImage( cgImageRef ); + NSImage *nsImage = wxOSXGetNSImageFromCGImage( cgImageRef ); NSCursor *cursor = [[NSCursor alloc] initWithImage:nsImage hotSpot:NSMakePoint( hotSpotX, hotSpotY )]; - [nsImage release]; - return cursor; }