From 01548e7c0212a36eadf52d6b3cd35bd4c68004cd Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Fri, 12 Sep 2008 18:36:08 +0000 Subject: [PATCH] CoreText fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55574 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/carbon/font.cpp | 105 ++++++++++++++++++++----------------- src/osx/carbon/fontdlg.cpp | 3 +- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/osx/carbon/font.cpp b/src/osx/carbon/font.cpp index c5b0cd5da8..1a699dcee8 100644 --- a/src/osx/carbon/font.cpp +++ b/src/osx/carbon/font.cpp @@ -183,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 ; @@ -247,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 ) @@ -339,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) ); @@ -376,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 { @@ -398,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: @@ -414,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[] = { @@ -1017,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 diff --git a/src/osx/carbon/fontdlg.cpp b/src/osx/carbon/fontdlg.cpp index c61ea57612..221f769ed8 100644 --- a/src/osx/carbon/fontdlg.cpp +++ b/src/osx/carbon/fontdlg.cpp @@ -229,8 +229,9 @@ int wxFontDialog::ShowModal() #if wxOSX_USE_CORE_TEXT if ( UMAGetSystemVersion() >= 0x1050 ) { - CTFontDescriptorRef descr = (CTFontDescriptorRef)font.MacGetCTFontDescriptor(); + CTFontDescriptorRef descr = (CTFontDescriptorRef) CTFontCopyFontDescriptor( (CTFontRef) font.MacGetCTFont() ); err = SetFontInfoForSelection (kFontSelectionCoreTextType,1, &descr , NULL); + CFRelease( descr ); setup = true; } #endif -- 2.47.2