]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/font.cpp
fixing focus, fixes #9985
[wxWidgets.git] / src / osx / carbon / font.cpp
index ba91fabee477db9011bcadba3d33ef9e28ba9efb..1a699dcee8afb68b29d9be4f206463998cbed1c7 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/mac/carbon/font.cpp
+// Name:        src/osx/carbon/font.cpp
 // Purpose:     wxFont class
 // Author:      Stefan Csomor
 // Modified by:
 #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 <ATSUnicode.h>
+#if wxOSX_USE_ATSU_TEXT && !wxOSX_USE_CARBON
+// include themeing support
+#include <Carbon/Carbon.h>
 #endif
 
 #include <map>
@@ -186,7 +183,6 @@ public:
 #endif
 #if wxOSX_USE_CORE_TEXT
     wxCFRef<CTFontRef> m_ctFont;
-    wxCFRef<CTFontDescriptorRef> m_ctFontDescriptor;
 #endif
 #if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT
     ATSUStyle       m_macATSUStyle ;
@@ -250,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 )
@@ -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)  );
@@ -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:
@@ -417,54 +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 ( (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  
             }
+
         }
 #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[] =
         {
@@ -739,6 +752,7 @@ bool wxFont::MacCreateFromCTFontDescriptor( const void * ctFontDescriptor , int
 
 #endif
 
+#if wxOSX_USE_CARBON
 bool wxFont::MacCreateFromThemeFont(wxUint16 themeFontID)
 {
 #if wxOSX_USE_CORE_TEXT
@@ -762,6 +776,7 @@ bool wxFont::MacCreateFromThemeFont(wxUint16 themeFontID)
 #endif
     return false;
 }
+#endif
 
 wxFont::~wxFont()
 {
@@ -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