X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2680ced12cbbed16990007c5fa3ea7730700122..57c6f0fe5f31e15e0cf7992f8eb654c82c1b7994:/src/osx/carbon/font.cpp diff --git a/src/osx/carbon/font.cpp b/src/osx/carbon/font.cpp index 6506760bbb..09f4b683e6 100644 --- a/src/osx/carbon/font.cpp +++ b/src/osx/carbon/font.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/font.cpp +// Name: src/osx/carbon/font.cpp // Purpose: wxFont class // Author: Stefan Csomor // Modified by: @@ -25,14 +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" -#endif -#ifndef __DARWIN__ -#include +#if wxOSX_USE_ATSU_TEXT && !wxOSX_USE_CARBON +// include themeing support +#include #endif #include @@ -57,9 +54,9 @@ public: } wxFontRefData(int size, - int family, - int style, - int weight, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, bool underlined, const wxString& faceName, wxFontEncoding encoding) @@ -67,7 +64,7 @@ public: Init(size, family, style, weight, underlined, faceName, encoding); } -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT wxFontRefData( wxUint32 coreTextFontType ); wxFontRefData( CTFontRef font ); wxFontRefData( CTFontDescriptorRef fontdescriptor, int size ); @@ -87,7 +84,7 @@ public: int GetPointSize() const { return m_pointSize; } - void SetFamily( int family ) + void SetFamily( wxFontFamily family ) { m_family = family; MacInvalidateNativeFont(); @@ -96,7 +93,7 @@ public: int GetFamily() const { return m_family; } - void SetStyle( int style ) + void SetStyle( wxFontStyle style ) { m_style = style; MacInvalidateNativeFont(); @@ -105,7 +102,7 @@ public: int GetStyle() const { return m_style; } - void SetWeight( int weight ) + void SetWeight( wxFontWeight weight ) { m_weight = weight; MacInvalidateNativeFont(); @@ -145,28 +142,28 @@ public: protected: // common part of all ctors void Init(int size, - int family, - int style, - int weight, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, bool underlined, const wxString& faceName, wxFontEncoding encoding); -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT void Init( CTFontRef font ); #endif // font characterstics int m_pointSize; - int m_family; - int m_style; - int m_weight; + wxFontFamily m_family; + wxFontStyle m_style; + wxFontWeight m_weight; bool m_underlined; wxString m_faceName; wxFontEncoding m_encoding; bool m_noAA; // No anti-aliasing public: -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT FMFontFamily m_macFontFamily; FMFontSize m_macFontSize; FMFontStyle m_macFontStyle; @@ -184,11 +181,10 @@ public: // information here, as this speeds up and optimizes rendering ThemeFontID m_macThemeFontID ; #endif -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT wxCFRef m_ctFont; - wxCFRef m_ctFontDescriptor; #endif -#if wxMAC_USE_CORE_TEXT || wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT ATSUStyle m_macATSUStyle ; #endif wxNativeFontInfo m_info; @@ -206,9 +202,9 @@ public: // ---------------------------------------------------------------------------- void wxFontRefData::Init(int pointSize, - int family, - int style, - int weight, + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, bool underlined, const wxString& faceName, wxFontEncoding encoding) @@ -222,7 +218,7 @@ void wxFontRefData::Init(int pointSize, m_faceName = faceName; m_encoding = encoding; m_noAA = false; -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT m_macFontFamily = 0 ; m_macFontSize = 0; m_macFontStyle = 0; @@ -230,14 +226,14 @@ void wxFontRefData::Init(int pointSize, m_macATSUAdditionalQDStyles = 0 ; m_macThemeFontID = kThemeCurrentPortFont ; #endif -#if wxMAC_USE_CORE_TEXT || wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT m_macATSUStyle = NULL ; #endif } wxFontRefData::~wxFontRefData() { -#if wxMAC_USE_CORE_TEXT || wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT if ( m_macATSUStyle ) { ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle); @@ -248,11 +244,10 @@ wxFontRefData::~wxFontRefData() void wxFontRefData::MacInvalidateNativeFont() { -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT m_ctFont.reset(); - m_ctFontDescriptor.reset(); #endif -#if wxMAC_USE_CORE_TEXT || wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT if ( m_macATSUStyle ) { ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle); @@ -261,7 +256,7 @@ void wxFontRefData::MacInvalidateNativeFont() #endif } -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT /* from Core Text Manual Common Operations */ @@ -342,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) ); @@ -361,7 +356,7 @@ void wxFontRefData::Init( CTFontRef font ) void wxFontRefData::MacFindFont() { -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT if ( UMAGetSystemVersion() >= 0x1050 ) { if ( m_faceName.empty() && m_family == wxDEFAULT ) @@ -379,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 { @@ -401,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: @@ -409,62 +406,80 @@ void wxFontRefData::MacFindFont() } } - + CTFontSymbolicTraits traits = 0; if (m_weight == wxBOLD) traits |= kCTFontBoldTrait; 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 ( (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 ); + { + wxString msg = wxString::Format( "font %s expected %d but got %d traits, %f angle \n" , + m_faceName.c_str(), traits, received, angle ); + printf( msg.c_str() ); + } + CFShow( dict ); + CFRelease( dict ); } +#endif } + } -#if wxMAC_USE_ATSU_TEXT +#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[] = { @@ -513,7 +528,7 @@ void wxFontRefData::MacFindFont() #endif } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { OSStatus status = noErr; Str255 qdFontName ; @@ -696,12 +711,12 @@ wxFont::wxFont(const wxString& fontdesc) } bool wxFont::Create(int pointSize, - int family, - int style, - int weight, - bool underlined, - const wxString& faceName, - wxFontEncoding encoding) + wxFontFamily family, + wxFontStyle style, + wxFontWeight weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding) { UnRef(); @@ -714,7 +729,7 @@ bool wxFont::Create(int pointSize, return true; } -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT bool wxFont::MacCreateFromUIFont(wxUint32 ctFontType ) { @@ -739,15 +754,16 @@ bool wxFont::MacCreateFromCTFontDescriptor( const void * ctFontDescriptor , int #endif +#if wxOSX_USE_CARBON bool wxFont::MacCreateFromThemeFont(wxUint16 themeFontID) { -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT if ( UMAGetSystemVersion() >= 0x1050) { return MacCreateFromUIFont(HIThemeGetUIFontType(themeFontID)); } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { UnRef(); @@ -762,6 +778,7 @@ bool wxFont::MacCreateFromThemeFont(wxUint16 themeFontID) #endif return false; } +#endif wxFont::~wxFont() { @@ -805,7 +822,7 @@ wxGDIRefData *wxFont::CreateGDIRefData() const wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const { - return new wxFontRefData(*wx_static_cast(const wxFontRefData *, data)); + return new wxFontRefData(*static_cast(data)); } void wxFont::SetPointSize(int pointSize) @@ -820,7 +837,7 @@ void wxFont::SetPointSize(int pointSize) RealizeResource(); } -void wxFont::SetFamily(int family) +void wxFont::SetFamily(wxFontFamily family) { Unshare(); @@ -829,7 +846,7 @@ void wxFont::SetFamily(int family) RealizeResource(); } -void wxFont::SetStyle(int style) +void wxFont::SetStyle(wxFontStyle style) { Unshare(); @@ -838,7 +855,7 @@ void wxFont::SetStyle(int style) RealizeResource(); } -void wxFont::SetWeight(int weight) +void wxFont::SetWeight(wxFontWeight weight) { Unshare(); @@ -904,23 +921,23 @@ wxSize wxFont::GetPixelSize() const #endif } -int wxFont::GetFamily() const +wxFontFamily wxFont::GetFamily() const { - wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + wxCHECK_MSG( M_FONTDATA != NULL , wxFONTFAMILY_MAX, wxT("invalid font") ); return M_FONTDATA->GetFamily(); } -int wxFont::GetStyle() const +wxFontStyle wxFont::GetStyle() const { - wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + wxCHECK_MSG( M_FONTDATA != NULL , wxFONTSTYLE_MAX, wxT("invalid font") ); return M_FONTDATA->GetStyle() ; } -int wxFont::GetWeight() const +wxFontWeight wxFont::GetWeight() const { - wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + wxCHECK_MSG( M_FONTDATA != NULL , wxFONTWEIGHT_MAX, wxT("invalid font") ); return M_FONTDATA->GetWeight(); } @@ -953,7 +970,7 @@ bool wxFont::GetNoAntiAliasing() const return M_FONTDATA->GetNoAntiAliasing(); } -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT short wxFont::MacGetFontNum() const { @@ -998,7 +1015,7 @@ wxUint16 wxFont::MacGetThemeFontID() const } #endif -#if wxMAC_USE_CORE_TEXT || wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT void * wxFont::MacGetATSUStyle() const { wxCHECK_MSG( M_FONTDATA != NULL , NULL, wxT("invalid font") ); @@ -1007,7 +1024,7 @@ void * wxFont::MacGetATSUStyle() const } #endif -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT const void * wxFont::MacGetCTFont() const { @@ -1016,13 +1033,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