+ 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")) ;