From 03c281617c54994698a74ee7a096cb5d1e03626f Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Thu, 8 Apr 2010 21:39:14 +0000 Subject: [PATCH] trying to simplify and optimize font handling git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63918 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/fontutil.h | 10 -- src/osx/carbon/font.cpp | 214 ++++++++++++++--------------------- src/osx/carbon/fontdlgosx.mm | 15 +-- src/osx/carbon/utilscocoa.mm | 79 ++++++------- 4 files changed, 120 insertions(+), 198 deletions(-) diff --git a/include/wx/fontutil.h b/include/wx/fontutil.h index 32c2806104..d52a6e3b77 100644 --- a/include/wx/fontutil.h +++ b/include/wx/fontutil.h @@ -154,9 +154,6 @@ public: void EnsureValid(); bool m_descriptorValid; -#if wxOSX_USE_CORE_TEXT - CTFontDescriptorRef m_ctFontDescriptor; -#endif #if wxOSX_USE_ATSU_TEXT bool m_atsuFontValid; @@ -168,13 +165,6 @@ public: wxInt16 m_qdFontFamily; wxInt16 m_qdFontStyle; #endif -#endif - -#if wxOSX_USE_COCOA - WX_NSFontDescriptor m_nsFontDescriptor; - void OSXValidateNSFontDescriptor(); -#endif -#if wxOSX_USE_IPHONE #endif int m_pointSize; diff --git a/src/osx/carbon/font.cpp b/src/osx/carbon/font.cpp index 725afb6699..c46f774724 100644 --- a/src/osx/carbon/font.cpp +++ b/src/osx/carbon/font.cpp @@ -161,6 +161,8 @@ public: wxCFRef m_ctFont; #endif #if wxOSX_USE_ATSU_TEXT + void CreateATSUFont(); + ATSUStyle m_macATSUStyle ; #endif wxCFRef m_cgFont; @@ -380,8 +382,78 @@ wxFontRefData::wxFontRefData(wxOSXSystemFont font, int size) #if wxOSX_USE_IPHONE m_uiFont = wxFont::OSXCreateUIFont( font, &m_info ); #endif + m_info.EnsureValid(); +#if wxOSX_USE_ATSU_TEXT + CreateATSUFont(); +#endif + + m_fontValid = true; } +#if wxOSX_USE_ATSU_TEXT +void wxFontRefData::CreateATSUFont() +{ + // we try to get as much styles as possible into ATSU + + OSStatus status = ::ATSUCreateStyle(&m_macATSUStyle); + wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ); + + ATSUAttributeTag atsuTags[] = + { + kATSUFontTag , + kATSUSizeTag , + kATSUVerticalCharacterTag, + kATSUQDBoldfaceTag , + kATSUQDItalicTag , + kATSUQDUnderlineTag , + kATSUQDCondensedTag , + kATSUQDExtendedTag , + }; + ByteCount atsuSizes[WXSIZEOF(atsuTags)] = + { + sizeof( ATSUFontID ) , + sizeof( Fixed ) , + sizeof( ATSUVerticalCharacterType), + sizeof( Boolean ) , + sizeof( Boolean ) , + sizeof( Boolean ) , + sizeof( Boolean ) , + sizeof( Boolean ) , + }; + + Boolean kTrue = true ; + Boolean kFalse = false ; + + Fixed atsuSize = IntToFixed( m_info.m_pointSize ); + ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal; + FMFontStyle addQDStyle = m_info.m_atsuAdditionalQDStyles; + ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = + { + &m_info.m_atsuFontID , + &atsuSize , + &kHorizontal, + (addQDStyle & bold) ? &kTrue : &kFalse , + (addQDStyle & italic) ? &kTrue : &kFalse , + (addQDStyle & underline) ? &kTrue : &kFalse , + (addQDStyle & condense) ? &kTrue : &kFalse , + (addQDStyle & extend) ? &kTrue : &kFalse , + }; + + status = ::ATSUSetAttributes( + (ATSUStyle)m_macATSUStyle, + WXSIZEOF(atsuTags), + atsuTags, atsuSizes, atsuValues); + + wxASSERT_MSG( status == noErr , wxString::Format(wxT("couldn't modify ATSU style. Status was %d"), (int) status).c_str() ); + + if ( m_cgFont.get() == NULL ) + { + ATSFontRef fontRef = FMGetATSFontRefFromFont(m_info.m_atsuFontID); + m_cgFont.reset( CGFontCreateWithPlatformFont( &fontRef ) ); + } +} +#endif + void wxFontRefData::MacFindFont() { if ( m_fontValid ) @@ -408,73 +480,19 @@ void wxFontRefData::MacFindFont() m_ctFont = fontcache[ std::wstring(lookupnameWithSize.wc_str()) ]; if ( !m_ctFont ) { - m_ctFont.reset( CTFontCreateWithFontDescriptor( m_info.m_ctFontDescriptor, 0/*m_pointSize */, NULL ) ); + m_ctFont.reset(CTFontCreateWithName( wxCFStringRef(m_info.m_faceName), m_info.m_pointSize , NULL )); + if ( traits != 0 ) + { + m_ctFont.reset(CTFontCreateCopyWithSymbolicTraits( m_ctFont, 0, NULL, traits, traits )); + } } + m_cgFont.reset(CTFontCopyGraphicsFont(m_ctFont, NULL)); } #endif #if wxOSX_USE_ATSU_TEXT - { - // we try to get as much styles as possible into ATSU - - OSStatus status = ::ATSUCreateStyle(&m_macATSUStyle); - wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ); - - ATSUAttributeTag atsuTags[] = - { - kATSUFontTag , - kATSUSizeTag , - kATSUVerticalCharacterTag, - kATSUQDBoldfaceTag , - kATSUQDItalicTag , - kATSUQDUnderlineTag , - kATSUQDCondensedTag , - kATSUQDExtendedTag , - }; - ByteCount atsuSizes[WXSIZEOF(atsuTags)] = - { - sizeof( ATSUFontID ) , - sizeof( Fixed ) , - sizeof( ATSUVerticalCharacterType), - sizeof( Boolean ) , - sizeof( Boolean ) , - sizeof( Boolean ) , - sizeof( Boolean ) , - sizeof( Boolean ) , - }; - - Boolean kTrue = true ; - Boolean kFalse = false ; - - Fixed atsuSize = IntToFixed( m_info.m_pointSize ); - ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal; - FMFontStyle addQDStyle = m_info.m_atsuAdditionalQDStyles; - ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = - { - &m_info.m_atsuFontID , - &atsuSize , - &kHorizontal, - (addQDStyle & bold) ? &kTrue : &kFalse , - (addQDStyle & italic) ? &kTrue : &kFalse , - (addQDStyle & underline) ? &kTrue : &kFalse , - (addQDStyle & condense) ? &kTrue : &kFalse , - (addQDStyle & extend) ? &kTrue : &kFalse , - }; - - status = ::ATSUSetAttributes( - (ATSUStyle)m_macATSUStyle, - WXSIZEOF(atsuTags), - atsuTags, atsuSizes, atsuValues); - - wxASSERT_MSG( status == noErr , wxString::Format(wxT("couldn't modify ATSU style. Status was %d"), (int) status).c_str() ); - - if ( m_cgFont.get() == NULL ) - { - ATSFontRef fontRef = FMGetATSFontRefFromFont(m_info.m_atsuFontID); - m_cgFont.reset( CGFontCreateWithPlatformFont( &fontRef ) ); - } - } + CreateATSUFont(); #endif #if wxOSX_USE_COCOA m_nsFont = wxFont::OSXCreateNSFont( &m_info ); @@ -901,9 +919,6 @@ static CTFontDescriptorRef wxMacCreateCTFontDescriptor(CFStringRef iFamilyName, void wxNativeFontInfo::Init() { -#if wxOSX_USE_CORE_TEXT - m_ctFontDescriptor = NULL; -#endif #if wxOSX_USE_ATSU_TEXT m_atsuFontID = 0 ; m_atsuAdditionalQDStyles = 0; @@ -912,9 +927,6 @@ void wxNativeFontInfo::Init() m_qdFontStyle = 0; m_qdFontFamily = 0; #endif -#endif -#if wxOSX_USE_COCOA - m_nsFontDescriptor = NULL; #endif m_pointSize = 0; m_family = wxFONTFAMILY_DEFAULT; @@ -930,14 +942,13 @@ void wxNativeFontInfo::Init() void wxNativeFontInfo::Init(CTFontDescriptorRef descr) { Init(); - m_ctFontDescriptor = wxCFRetain(descr); - wxCFRef< CFNumberRef > sizevalue( (CFNumberRef) CTFontDescriptorCopyAttribute( m_ctFontDescriptor, kCTFontSizeAttribute ) ); + wxCFRef< CFNumberRef > sizevalue( (CFNumberRef) CTFontDescriptorCopyAttribute( descr, kCTFontSizeAttribute ) ); float fsize; if ( CFNumberGetValue( sizevalue , kCFNumberFloatType , &fsize ) ) m_pointSize = (int)( fsize + 0.5 ); - wxCFRef< CFDictionaryRef > traitsvalue( (CFDictionaryRef) CTFontDescriptorCopyAttribute( m_ctFontDescriptor, kCTFontTraitsAttribute ) ); + wxCFRef< CFDictionaryRef > traitsvalue( (CFDictionaryRef) CTFontDescriptorCopyAttribute( descr, kCTFontTraitsAttribute ) ); CTFontSymbolicTraits traits; if ( CFNumberGetValue((CFNumberRef) CFDictionaryGetValue(traitsvalue,kCTFontSymbolicTrait),kCFNumberIntType,&traits) ) { @@ -947,7 +958,7 @@ void wxNativeFontInfo::Init(CTFontDescriptorRef descr) m_weight = wxFONTWEIGHT_BOLD ; } - wxCFStringRef familyName( (CFStringRef) CTFontDescriptorCopyAttribute(m_ctFontDescriptor, kCTFontFamilyNameAttribute)); + wxCFStringRef familyName( (CFStringRef) CTFontDescriptorCopyAttribute(descr, kCTFontFamilyNameAttribute)); m_faceName = familyName.AsString(); } #endif @@ -957,46 +968,6 @@ void wxNativeFontInfo::EnsureValid() if ( m_descriptorValid ) return; -#if wxOSX_USE_CORE_TEXT - if ( m_ctFontDescriptor == NULL && UMAGetSystemVersion() >= 0x1050 ) - { - CTFontSymbolicTraits traits = 0; - - if (m_weight == wxFONTWEIGHT_BOLD) - traits |= kCTFontBoldTrait; - if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT) - traits |= kCTFontItalicTrait; - - // use font caching - wxString lookupnameWithSize = wxString::Format( "%s_%ld_%ld", m_faceName.c_str(), traits, m_pointSize ); - - static std::map< std::wstring , wxCFRef< CTFontDescriptorRef > > fontdescriptorcache ; - m_ctFontDescriptor = wxCFRetain((CTFontDescriptorRef)fontdescriptorcache[ std::wstring(lookupnameWithSize.wc_str()) ]); - if ( !m_ctFontDescriptor ) - { - // QD selection algorithm is the fastest by orders of magnitude on 10.5 - if ( m_faceName.IsAscii() ) - { - uint8_t qdstyle = 0; - if (m_weight == wxFONTWEIGHT_BOLD) - qdstyle |= bold; - if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT) - qdstyle |= italic; - - Str255 qdFontName ; - wxMacStringToPascal( m_faceName , qdFontName ); - wxCFRef< CTFontRef > font; - font.reset( CTFontCreateWithQuickdrawInstance(qdFontName, 0 , qdstyle, m_pointSize) ); - m_ctFontDescriptor = CTFontCopyFontDescriptor(font); - } - else - { - m_ctFontDescriptor = wxMacCreateCTFontDescriptor( wxCFStringRef(m_faceName),traits ); - } - fontdescriptorcache[ std::wstring(lookupnameWithSize.wc_str()) ].reset(wxCFRetain(m_ctFontDescriptor)); - } - } -#endif #if wxOSX_USE_ATSU_TEXT if ( !m_atsuFontValid ) { @@ -1038,13 +1009,6 @@ void wxNativeFontInfo::EnsureValid() m_atsuAdditionalQDStyles = m_qdFontStyle & (~intrinsicStyle ); m_atsuFontValid = true; } -#endif -#if wxOSX_USE_COCOA - if ( m_nsFontDescriptor == NULL ) - OSXValidateNSFontDescriptor(); -#endif -#if wxOSX_USE_IPHONE - // TODO #endif m_descriptorValid = true; } @@ -1052,9 +1016,6 @@ void wxNativeFontInfo::EnsureValid() void wxNativeFontInfo::Init(const wxNativeFontInfo& info) { Init(); -#if wxOSX_USE_CORE_TEXT - m_ctFontDescriptor = wxCFRetain(info.m_ctFontDescriptor); -#endif #if wxOSX_USE_ATSU_TEXT m_atsuFontValid = info.m_atsuFontValid; m_atsuFontID = info.m_atsuFontID ; @@ -1063,9 +1024,6 @@ void wxNativeFontInfo::Init(const wxNativeFontInfo& info) m_qdFontFamily = info.m_qdFontFamily; m_qdFontStyle = info.m_qdFontStyle; #endif -#endif -#if wxOSX_USE_COCOA - m_nsFontDescriptor = (NSFontDescriptor*) wxMacCocoaRetain(info.m_nsFontDescriptor); #endif m_pointSize = info.m_pointSize; m_family = info.m_family; @@ -1100,18 +1058,10 @@ void wxNativeFontInfo::Init(int size, void wxNativeFontInfo::Free() { -#if wxOSX_USE_CORE_TEXT - wxCFRelease(m_ctFontDescriptor); - m_ctFontDescriptor = NULL; -#endif #if wxOSX_USE_ATSU_TEXT m_atsuFontID = 0 ; m_atsuAdditionalQDStyles = 0; m_atsuFontValid = false; -#endif -#if wxOSX_USE_COCOA - wxMacCocoaRelease(m_nsFontDescriptor); - m_nsFontDescriptor = NULL; #endif m_descriptorValid = false; } diff --git a/src/osx/carbon/fontdlgosx.mm b/src/osx/carbon/fontdlgosx.mm index 9f8470c9d7..bb8f35642a 100644 --- a/src/osx/carbon/fontdlgosx.mm +++ b/src/osx/carbon/fontdlgosx.mm @@ -208,20 +208,7 @@ int RunMixedFontDialog(wxFontDialog* dialog) #if wxOSX_USE_COCOA NSFont* theFont = [fontPanel panelConvertFont:[NSFont userFontOfSize:0]]; - //Get more information about the user's chosen font - NSFontTraitMask theTraits = [[NSFontManager sharedFontManager] traitsOfFont:theFont]; - int theFontWeight = [[NSFontManager sharedFontManager] weightOfFont:theFont]; - int theFontSize = (int) [theFont pointSize]; - - wxFontFamily fontFamily = wxFONTFAMILY_DEFAULT; - //Set the wx font to the appropriate data - if(theTraits & NSFixedPitchFontMask) - fontFamily = wxFONTFAMILY_TELETYPE; - - fontdata.m_chosenFont = wxFont( theFontSize, fontFamily, - theTraits & NSItalicFontMask ? wxFONTSTYLE_ITALIC : 0, - theFontWeight < 5 ? wxLIGHT : theFontWeight >= 9 ? wxBOLD : wxNORMAL, - false, wxStringWithNSString([theFont familyName]) ); + fontdata.m_chosenFont = wxFont( theFont ); //Get the shared color panel along with the chosen color and set the chosen color NSColor* theColor = [[[NSColorPanel sharedColorPanel] color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; diff --git a/src/osx/carbon/utilscocoa.mm b/src/osx/carbon/utilscocoa.mm index 394b02b076..c46711cec4 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,26 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) return nsfont; } -void wxNativeFontInfo::OSXValidateNSFontDescriptor() +WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) { - NSFontDescriptor* desc = nil; - NSFontSymbolicTraits traits = 0; - float weight = 0; - - if (m_weight == wxFONTWEIGHT_BOLD) + 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; -} + nsFont = [[NSFontManager sharedFontManager] fontWithFamily:wxCFStringRef(info->m_faceName).AsNSString() + traits:traits weight:weight size:info->m_pointSize]; -WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) -{ - NSFont* nsFont; - nsFont = [NSFont fontWithDescriptor:info->m_nsFontDescriptor size:info->m_pointSize]; + wxASSERT_MSG(nsFont != nil,wxT("Couldn't create nsFont")) ; wxMacCocoaRetain(nsFont); return nsFont; } -- 2.45.2