X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6aa3f3de0cc3d0d3787739d354486d070cd778be..c9ed413ab4f5673ffff00198dc6ce1397398bda4:/src/osx/carbon/utilscocoa.mm diff --git a/src/osx/carbon/utilscocoa.mm b/src/osx/carbon/utilscocoa.mm index 394b02b076..49fc2247d0 100644 --- a/src/osx/carbon/utilscocoa.mm +++ b/src/osx/carbon/utilscocoa.mm @@ -23,6 +23,10 @@ #include "wx/fontutil.h" +#if wxOSX_USE_COCOA +#include "wx/cocoa/string.h" +#endif + #ifdef __WXMAC__ #if wxOSX_USE_CARBON @@ -110,31 +114,39 @@ wxFont::wxFont(WX_NSFont nsfont) Create(info); } -void wxFont::SetNativeInfoFromNSFont(WX_NSFont nsfont, wxNativeFontInfo* info) +void wxFont::SetNativeInfoFromNSFont(WX_NSFont theFont, wxNativeFontInfo* info) { - NSFontDescriptor*desc = [[nsfont fontDescriptor] retain]; if ( info->m_faceName.empty()) { + //Get more information about the user's chosen font + NSFontTraitMask theTraits = [[NSFontManager sharedFontManager] traitsOfFont:theFont]; + int theFontWeight = [[NSFontManager sharedFontManager] weightOfFont:theFont]; + + wxFontFamily fontFamily = wxFONTFAMILY_DEFAULT; + //Set the wx font to the appropriate data + if(theTraits & NSFixedPitchFontMask) + fontFamily = wxFONTFAMILY_TELETYPE; + wxFontStyle fontstyle = wxFONTSTYLE_NORMAL; wxFontWeight fontweight = wxFONTWEIGHT_NORMAL; bool underlined = false; - int size = (int) ([desc pointSize]+0.5); - NSFontSymbolicTraits traits = [desc symbolicTraits]; - - if ( traits & NSFontBoldTrait ) + int size = (int) ([theFont pointSize]+0.5); + + if ( theFontWeight >= 9 ) fontweight = wxFONTWEIGHT_BOLD ; + else if ( theFontWeight < 5 ) + fontweight = wxFONTWEIGHT_LIGHT; else fontweight = wxFONTWEIGHT_NORMAL ; - if ( traits & NSFontItalicTrait ) + + if ( theTraits & NSItalicFontMask ) fontstyle = wxFONTSTYLE_ITALIC ; - wxCFStringRef fontname( [desc postscriptName] ); - info->Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined, - fontname.AsString(), wxFONTENCODING_DEFAULT); + info->Init(size,fontFamily,fontstyle,fontweight,underlined, + wxStringWithNSString([theFont familyName]), wxFONTENCODING_DEFAULT); } - info->m_nsFontDescriptor = desc; } WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) @@ -176,43 +188,89 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) return nsfont; } -void wxNativeFontInfo::OSXValidateNSFontDescriptor() -{ - NSFontDescriptor* desc = nil; - NSFontSymbolicTraits traits = 0; - float weight = 0; +static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } +static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, tan(DegToRad(11)), 1, 0, 0 }; - if (m_weight == wxFONTWEIGHT_BOLD) +WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) +{ + NSFont* nsFont; + int weight = 5; + NSFontTraitMask traits = 0; + if (info->m_weight == wxFONTWEIGHT_BOLD) { - traits |= NSFontBoldTrait; - weight = 1.0; + traits |= NSBoldFontMask; + weight = 9; } - else if (m_weight == wxFONTWEIGHT_LIGHT) - weight = -1; + else if (info->m_weight == wxFONTWEIGHT_LIGHT) + weight = 3; - if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT) - traits |= NSFontItalicTrait; + if (info->m_style == wxFONTSTYLE_ITALIC || info->m_style == wxFONTSTYLE_SLANT) + traits |= NSItalicFontMask; - NSDictionary* traitsdict = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithUnsignedInt:traits], NSFontSymbolicTrait, - nil] ; - - desc = [NSFontDescriptor fontDescriptorWithFontAttributes: - [NSDictionary dictionaryWithObjectsAndKeys: - wxCFStringRef(m_faceName).AsNSString(), NSFontFamilyAttribute, - [NSNumber numberWithFloat:m_pointSize], NSFontSizeAttribute, - traitsdict, NSFontTraitsAttribute, - [NSNumber numberWithFloat:weight],NSFontWeightTrait, - nil]]; - - wxMacCocoaRetain(desc); - m_nsFontDescriptor = desc; -} - -WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) -{ - NSFont* nsFont; - nsFont = [NSFont fontWithDescriptor:info->m_nsFontDescriptor size:info->m_pointSize]; + 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; } @@ -288,7 +346,7 @@ 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]; @@ -300,7 +358,7 @@ WX_UIImage wxOSXCreateUIImageFromCGImage( CGImageRef image ) #if wxOSX_USE_COCOA // 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); @@ -548,11 +606,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; }