+wxFont::wxFont(WX_NSFont nsfont)
+{
+ [nsfont retain];
+ wxNativeFontInfo info;
+ SetNativeInfoFromNSFont(nsfont, &info);
+ Create(info);
+}
+
+void wxFont::SetNativeInfoFromNSFont(WX_NSFont theFont, wxNativeFontInfo* info)
+{
+ 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) ([theFont pointSize]+0.5);
+
+ if ( theFontWeight >= 9 )
+ fontweight = wxFONTWEIGHT_BOLD ;
+ else if ( theFontWeight < 5 )
+ fontweight = wxFONTWEIGHT_LIGHT;
+ else
+ fontweight = wxFONTWEIGHT_NORMAL ;
+
+ if ( theTraits & NSItalicFontMask )
+ fontstyle = wxFONTSTYLE_ITALIC ;
+
+ info->Init(size,fontFamily,fontstyle,fontweight,underlined,
+ wxStringWithNSString([theFont familyName]), wxFONTENCODING_DEFAULT);
+
+ }
+}
+
+WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info)
+{
+ NSFont* nsfont = nil;
+ switch( font )
+ {
+ case wxOSX_SYSTEM_FONT_NORMAL:
+ nsfont = [NSFont systemFontOfSize:[NSFont systemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_BOLD:
+ nsfont = [NSFont boldSystemFontOfSize:[NSFont systemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_SMALL:
+ nsfont = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_SMALL_BOLD:
+ nsfont = [NSFont boldSystemFontOfSize:[NSFont smallSystemFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_MINI:
+ nsfont = [NSFont systemFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSMiniControlSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_MINI_BOLD:
+ nsfont = [NSFont boldSystemFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSMiniControlSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_LABELS:
+ nsfont = [NSFont labelFontOfSize:[NSFont labelFontSize]];
+ break;
+ case wxOSX_SYSTEM_FONT_VIEWS:
+ nsfont = [NSFont controlContentFontOfSize:0];
+ break;
+ default:
+ break;
+ }
+ [nsfont retain];
+ SetNativeInfoFromNSFont(nsfont, 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;
+ 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];
+ if ( info->m_faceName.empty())
+ {
+ wxFontStyle fontstyle = wxFONTSTYLE_NORMAL;
+ wxFontWeight fontweight = wxFONTWEIGHT_NORMAL;
+ bool underlined = false;
+
+ int size = (int) ([uifont pointSize]+0.5);
+ /*
+ NSFontSymbolicTraits traits = [desc symbolicTraits];
+
+ if ( traits & NSFontBoldTrait )
+ fontweight = wxFONTWEIGHT_BOLD ;
+ else
+ fontweight = wxFONTWEIGHT_NORMAL ;
+ if ( traits & NSFontItalicTrait )
+ fontstyle = wxFONTSTYLE_ITALIC ;
+ */
+ wxCFStringRef fontname( wxCFRetain([uifont familyName]) );
+ info->Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
+ fontname.AsString(), wxFONTENCODING_DEFAULT);
+
+ }
+ return uifont;
+}
+
+WX_UIFont wxFont::OSXCreateUIFont(const wxNativeFontInfo* info)
+{
+ UIFont* uiFont;
+ uiFont = [UIFont fontWithName:wxCFStringRef(info->m_faceName).AsNSString() size:info->m_pointSize];
+ wxMacCocoaRetain(uiFont);
+ return uiFont;
+}