+ SetNativeInfoFromNSFont(nsfont, info);
+ return nsfont;
+}
+
+static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
+static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, static_cast<CGFloat>(tan(DegToRad(11))), 1, 0, 0 };
+
+WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info)
+{
+ NSFont* nsFont;
+ int weight = 5;
+ NSFontTraitMask traits = 0;
+ if (info->m_weight == wxFONTWEIGHT_BOLD)
+ {
+ traits |= NSBoldFontMask;
+ weight = 9;
+ }
+ else if (info->m_weight == wxFONTWEIGHT_LIGHT)
+ weight = 3;
+
+ if (info->m_style == wxFONTSTYLE_ITALIC || info->m_style == wxFONTSTYLE_SLANT)
+ traits |= NSItalicFontMask;
+
+ 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;
+}
+
+#endif
+
+#if wxOSX_USE_IPHONE
+
+WX_UIFont wxFont::OSXCreateUIFont(wxOSXSystemFont font, wxNativeFontInfo* info)
+{
+ UIFont* uifont;
+ switch( font )
+ {
+ case wxOSX_SYSTEM_FONT_NORMAL:
+ uifont = [UIFont systemFontOfSize:[UIFont systemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_BOLD:
+ uifont = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_MINI:
+ case wxOSX_SYSTEM_FONT_SMALL:
+ uifont = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_MINI_BOLD:
+ case wxOSX_SYSTEM_FONT_SMALL_BOLD:
+ uifont = [UIFont boldSystemFontOfSize:[UIFont smallSystemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_VIEWS:
+ case wxOSX_SYSTEM_FONT_LABELS:
+ uifont = [UIFont systemFontOfSize:[UIFont labelFontSize]];
+ break;
+ default:
+ break;
+ }
+ [uifont retain];