X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/36eca861601eb5329d7b87bc6e93cc31c49584f9..472137baebae6c011ad7d70285de454b9ce7796d:/src/osx/carbon/font.cpp?ds=sidebyside diff --git a/src/osx/carbon/font.cpp b/src/osx/carbon/font.cpp index fcd8f90466..1a699dcee8 100644 --- a/src/osx/carbon/font.cpp +++ b/src/osx/carbon/font.cpp @@ -25,10 +25,11 @@ #include "wx/graphics.h" #include "wx/settings.h" -#if wxOSX_USE_CARBON -#include "wx/osx/uma.h" -#else #include "wx/osx/private.h" + +#if wxOSX_USE_ATSU_TEXT && !wxOSX_USE_CARBON +// include themeing support +#include #endif #include @@ -182,7 +183,6 @@ public: #endif #if wxOSX_USE_CORE_TEXT wxCFRef m_ctFont; - wxCFRef m_ctFontDescriptor; #endif #if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT ATSUStyle m_macATSUStyle ; @@ -246,7 +246,6 @@ void wxFontRefData::MacInvalidateNativeFont() { #if wxOSX_USE_CORE_TEXT m_ctFont.reset(); - m_ctFontDescriptor.reset(); #endif #if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT if ( m_macATSUStyle ) @@ -338,7 +337,7 @@ wxFontRefData::wxFontRefData( CTFontDescriptorRef fontdescriptor, int size ) float fsize; if ( CFNumberGetValue( value , kCFNumberFloatType , &fsize ) ) { - size = (int) fsize + 0.5 ; + size = (int)( fsize + 0.5 ); } } Init( CTFontCreateWithFontDescriptor(fontdescriptor, size,NULL) ); @@ -375,8 +374,6 @@ void wxFontRefData::MacFindFont() m_style = wxITALIC; if ( traits & kCTFontBoldTrait ) m_weight = wxBOLD ; - if ( !m_ctFontDescriptor.get() ) - m_ctFontDescriptor.reset( CTFontCopyFontDescriptor( m_ctFont ) ); } else { @@ -397,6 +394,10 @@ void wxFontRefData::MacFindFont() case wxMODERN : case wxTELETYPE: m_faceName = wxT("Courier"); + if ( m_style == wxITALIC && m_weight == wxNORMAL ) + { + m_style = wxITALIC; + } break ; default: @@ -413,56 +414,70 @@ void wxFontRefData::MacFindFont() if (m_style == wxITALIC || m_style == wxSLANT) traits |= kCTFontItalicTrait; -// use font descriptor caching -#if 0 - wxString lookupname = wxString::Format( "%s_%ld", m_faceName.c_str(), traits ); - - static std::map< std::wstring , wxCFRef< CTFontDescriptorRef > > fontdescriptorcache ; - - m_ctFontDescriptor = fontdescriptorcache[ std::wstring(lookupname.wc_str()) ]; - if ( !m_ctFontDescriptor ) - { - wxCFStringRef cf( m_faceName, wxLocale::GetSystemEncoding() ); - m_ctFontDescriptor.reset( wxMacCreateCTFontDescriptor( cf, traits ) ); - fontdescriptorcache[ std::wstring(lookupname.wc_str()) ] = m_ctFontDescriptor; - } -#else - wxCFStringRef cf( m_faceName, wxLocale::GetSystemEncoding() ); - m_ctFontDescriptor.reset( wxMacCreateCTFontDescriptor( cf, traits ) ); -#endif - -// use font caching -#if 0 + // use font caching wxString lookupnameWithSize = wxString::Format( "%s_%ld_%ld", m_faceName.c_str(), traits, m_pointSize ); static std::map< std::wstring , wxCFRef< CTFontRef > > fontcache ; m_ctFont = fontcache[ std::wstring(lookupnameWithSize.wc_str()) ]; if ( !m_ctFont ) { - m_ctFont.reset( CTFontCreateWithFontDescriptor( m_ctFontDescriptor, m_pointSize, NULL ) ); + // QD selection algorithm is the fastest by orders of magnitude on 10.5 + if ( m_faceName.IsAscii() ) + { + uint8 qdstyle = 0; + if (m_weight == wxBOLD) + qdstyle |= bold; + if (m_style == wxITALIC || m_style == wxSLANT) + qdstyle |= italic; + + Str255 qdFontName ; + wxMacStringToPascal( m_faceName , qdFontName ); + m_ctFont.reset( CTFontCreateWithQuickdrawInstance(qdFontName, 0 , qdstyle, m_pointSize) ); + } + else + { + + static std::map< std::wstring , wxCFRef< CTFontDescriptorRef > > fontdescriptorcache ; + wxString lookupname = wxString::Format( "%s_%ld", m_faceName.c_str(), traits ); + // descriptor caching + wxCFRef< CTFontDescriptorRef > descriptor = fontdescriptorcache[ std::wstring(lookupname.wc_str()) ]; + if ( !descriptor ) + { + wxCFStringRef cf( m_faceName, wxLocale::GetSystemEncoding() ); + descriptor.reset( wxMacCreateCTFontDescriptor( cf, traits ) ); + fontdescriptorcache[ std::wstring(lookupname.wc_str()) ] = descriptor; + } + m_ctFont.reset( CTFontCreateWithFontDescriptor( descriptor, m_pointSize, NULL ) ); + CTFontSymbolicTraits received = CTFontGetSymbolicTraits( m_ctFont ) & 0x03; + if ( traits != received ) + { + // TODO further fallbacks, synthesizing bold and italic, trying direct PostScript names etc + } + } + fontcache[ std::wstring(lookupnameWithSize.wc_str()) ] = m_ctFont; - } -#else - m_ctFont.reset( CTFontCreateWithFontDescriptor( m_ctFontDescriptor, m_pointSize, NULL ) ); -#endif - if ( /* (CTFontGetSymbolicTraits( m_ctFont ) & 0x03) !=*/ traits ) - { - CTFontRef font = CTFontCreateWithName( cf, m_pointSize, NULL ); - CTFontRef font2 = CTFontCreateCopyWithSymbolicTraits( font, m_pointSize, NULL, traits, 0x03 ); - CFRelease(font); - m_ctFont.reset( font2 ); -#if 0 // debugging coretext font matching - if ( (CTFontGetSymbolicTraits( m_ctFont ) & 0x03) != traits ) +#if 1 // debugging coretext font matching + CTFontSymbolicTraits received = CTFontGetSymbolicTraits( m_ctFont ) & 0x03; + if ( received != traits ) { - wxMessageBox( wxString::Format( "expected %d but got %d traits" , traits, (CTFontGetSymbolicTraits( m_ctFont ) & 0x03) ) ); + float angle = CTFontGetSlantAngle( m_ctFont ); + CFDictionaryRef dict = CTFontCopyTraits( m_ctFont ); + CFNumberRef number = (CFNumberRef) CFDictionaryGetValue(dict, kCTFontWeightTrait ); + float floatnumber; + CFNumberGetValue( number, kCFNumberFloatType, &floatnumber ); + { + printf( wxString::Format( "font %s expected %d but got %d traits, %f angle \n" , m_faceName.c_str(), traits, received, angle ) ); + } + CFShow( dict ); + CFRelease( dict ); } -#endif +#endif } + } #if wxOSX_USE_ATSU_TEXT OSStatus status = noErr; - CTFontDescriptorRef desc = m_ctFontDescriptor ; - ATSFontRef atsfont = CTFontGetPlatformFont( m_ctFont, &desc ); + ATSFontRef atsfont = CTFontGetPlatformFont( m_ctFont, NULL ); FMFont fmfont = FMGetFontFromATSFontRef( atsfont ); ATSUAttributeTag atsuTags[] = { @@ -1016,13 +1031,6 @@ const void * wxFont::MacGetCTFont() const return (CTFontRef)(M_FONTDATA->m_ctFont); } -const void * wxFont::MacGetCTFontDescriptor() const -{ - wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); - - return (CTFontDescriptorRef)(M_FONTDATA->m_ctFontDescriptor); -} - #endif const wxNativeFontInfo * wxFont::GetNativeFontInfo() const