]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/font.cpp
implement wxLIST_AUTOSIZE support in wxMac's wxListCtrl
[wxWidgets.git] / src / mac / carbon / font.cpp
index 0f06f3d96d657c8bdfe89fa3aaef9bf7b51f0fce..e5ebd6dc39b6510952c043805f1c15217221d422 100644 (file)
@@ -30,6 +30,8 @@
 #include <ATSUnicode.h>
 #endif
 
+#include <map>
+#include <string>
 
 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
 
@@ -300,7 +302,7 @@ static CTFontDescriptorRef wxMacCreateCTFontDescriptor(CFStringRef iFamilyName,
                 CFRelease(symTraits);
             }
         }
-        // Create the font descriptor with our attributes and input size.
+        // Create the font descriptor with our attributes
         descriptor = CTFontDescriptorCreateWithAttributes(attributes);
         check(descriptor != NULL);
 
@@ -402,17 +404,46 @@ void wxFontRefData::MacFindFont()
                 }
             }
 
-            wxCFStringRef cf( m_faceName, wxLocale::GetSystemEncoding() );
+            
             CTFontSymbolicTraits traits = 0;
 
             if (m_weight == wxBOLD)
                 traits |= kCTFontBoldTrait;
             if (m_style == wxITALIC || m_style == wxSLANT)
                 traits |= kCTFontItalicTrait;
-
+     
+// use font descriptor caching
+#if 1
+            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 1
+            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 ) );
+                fontcache[ std::wstring(lookupnameWithSize.wc_str()) ] = m_ctFont;
+            }
+#else
             m_ctFont.reset( CTFontCreateWithFontDescriptor( m_ctFontDescriptor, m_pointSize, NULL ) );
+#endif
         }
 #if wxMAC_USE_ATSU_TEXT == 0
         OSStatus status = noErr;