]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/font.cpp
Fix hangups when using sockets under OS X.
[wxWidgets.git] / src / osx / carbon / font.cpp
index 6db61909200f8e24ebdab9b7a7fae03034971c3c..c37e0c8f1e72c35fdd426f660bcd759d4504fbb9 100644 (file)
@@ -170,9 +170,10 @@ public:
 #if wxOSX_USE_CORE_TEXT
     wxCFRef<CTFontRef> m_ctFont;
 #endif
 #if wxOSX_USE_CORE_TEXT
     wxCFRef<CTFontRef> m_ctFont;
 #endif
-#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
     ATSUStyle       m_macATSUStyle ;
 #endif
     ATSUStyle       m_macATSUStyle ;
 #endif
+    wxCFRef<CGFontRef> m_cgFont;
 #if wxOSX_USE_COCOA
     WX_NSFont       m_nsFont;
 #endif
 #if wxOSX_USE_COCOA
     WX_NSFont       m_nsFont;
 #endif
@@ -195,8 +196,9 @@ wxFontRefData::wxFontRefData(const wxFontRefData& data)
 #endif
 #if wxOSX_USE_CORE_TEXT
     m_ctFont = data.m_ctFont;
 #endif
 #if wxOSX_USE_CORE_TEXT
     m_ctFont = data.m_ctFont;
-#endif
-#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT
+#endif 
+    m_cgFont = data.m_cgFont;
+#if wxOSX_USE_ATSU_TEXT
     if ( data.m_macATSUStyle != NULL )
     {
         ATSUCreateStyle(&m_macATSUStyle) ;
     if ( data.m_macATSUStyle != NULL )
     {
         ATSUCreateStyle(&m_macATSUStyle) ;
@@ -207,7 +209,7 @@ wxFontRefData::wxFontRefData(const wxFontRefData& data)
     m_nsFont = (NSFont*) wxMacCocoaRetain(data.m_nsFont);
 #endif
 #if wxOSX_USE_IPHONE
     m_nsFont = (NSFont*) wxMacCocoaRetain(data.m_nsFont);
 #endif
 #if wxOSX_USE_IPHONE
-    m_uiFont = wxMacCocoaRetain(data.m_uiFont);
+    m_uiFont = (UIFont*) wxMacCocoaRetain(data.m_uiFont);
 #endif
     
 }
 #endif
     
 }
@@ -226,7 +228,7 @@ void wxFontRefData::Init()
 #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT
     m_macThemeFontID = kThemeCurrentPortFont ;
 #endif
 #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT
     m_macThemeFontID = kThemeCurrentPortFont ;
 #endif
-#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
     m_macATSUStyle = NULL ;
 #endif
 #if wxOSX_USE_COCOA
     m_macATSUStyle = NULL ;
 #endif
 #if wxOSX_USE_COCOA
@@ -248,7 +250,11 @@ void wxFontRefData::Free()
 #if wxOSX_USE_CORE_TEXT
     m_ctFont.reset();
 #endif
 #if wxOSX_USE_CORE_TEXT
     m_ctFont.reset();
 #endif
-#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT
+    m_cgFont.reset();
+#if wxOSX_USE_ATSU_TEXT
+#if wxOSX_USE_CARBON
+    m_macThemeFontID = kThemeCurrentPortFont ;
+#endif
     if ( m_macATSUStyle )
     {
         ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle);
     if ( m_macATSUStyle )
     {
         ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle);
@@ -280,7 +286,7 @@ wxFontRefData::wxFontRefData(wxOSXSystemFont font, int size)
 #if wxOSX_USE_CORE_TEXT
     if (  UMAGetSystemVersion() >= 0x1050 )
     {
 #if wxOSX_USE_CORE_TEXT
     if (  UMAGetSystemVersion() >= 0x1050 )
     {
-        CTFontUIFontType uifont;
+        CTFontUIFontType uifont = kCTFontSystemFontType;
         switch( font )
         {
             case wxOSX_SYSTEM_FONT_NORMAL:
         switch( font )
         {
             case wxOSX_SYSTEM_FONT_NORMAL:
@@ -318,6 +324,10 @@ wxFontRefData::wxFontRefData(wxOSXSystemFont font, int size)
 #endif
 #if wxOSX_USE_ATSU_TEXT
     {
 #endif
 #if wxOSX_USE_ATSU_TEXT
     {
+#if !wxOSX_USE_CARBON
+        // not needed outside
+        ThemeFontID m_macThemeFontID = kThemeSystemFont;
+#endif
         switch( font )
         {
             case wxOSX_SYSTEM_FONT_NORMAL:
         switch( font )
         {
             case wxOSX_SYSTEM_FONT_NORMAL:
@@ -371,16 +381,16 @@ wxFontRefData::wxFontRefData(wxOSXSystemFont font, int size)
             if ( style & underline )
                 underlined = true ;
                 
             if ( style & underline )
                 underlined = true ;
                 
-            m_info.Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
+            m_info.Init(fontSize,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
                 wxMacMakeStringFromPascal( qdFontName ), wxFONTENCODING_DEFAULT);
          }
     }
 #endif
 #if wxOSX_USE_COCOA
                 wxMacMakeStringFromPascal( qdFontName ), wxFONTENCODING_DEFAULT);
          }
     }
 #endif
 #if wxOSX_USE_COCOA
-    m_nsFont = wxFont::CreateNSFont( font, &m_info );
+    m_nsFont = wxFont::OSXCreateNSFont( font, &m_info );
 #endif
 #if wxOSX_USE_IPHONE
 #endif
 #if wxOSX_USE_IPHONE
-    m_uiFont = wxFont::CreateUIFont( font, &m_info );
+    m_uiFont = wxFont::OSXCreateUIFont( font, &m_info );
 #endif
 }
 
 #endif
 }
 
@@ -410,6 +420,7 @@ void wxFontRefData::MacFindFont()
         {
             m_ctFont.reset( CTFontCreateWithFontDescriptor( m_info.m_ctFontDescriptor, 0/*m_pointSize */, NULL ) );
         }
         {
             m_ctFont.reset( CTFontCreateWithFontDescriptor( m_info.m_ctFontDescriptor, 0/*m_pointSize */, NULL ) );
         }
+        m_cgFont.reset(CTFontCopyGraphicsFont(m_ctFont, NULL));
     }
 
 #endif
     }
 
 #endif
@@ -431,7 +442,7 @@ void wxFontRefData::MacFindFont()
             kATSUQDCondensedTag ,
             kATSUQDExtendedTag ,
         };
             kATSUQDCondensedTag ,
             kATSUQDExtendedTag ,
         };
-        ByteCount atsuSizes[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] =
+        ByteCount atsuSizes[WXSIZEOF(atsuTags)] =
         {
             sizeof( ATSUFontID ) ,
             sizeof( Fixed ) ,
         {
             sizeof( ATSUFontID ) ,
             sizeof( Fixed ) ,
@@ -449,7 +460,7 @@ void wxFontRefData::MacFindFont()
         Fixed atsuSize = IntToFixed( m_info.m_pointSize );
         ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
         FMFontStyle addQDStyle = m_info.m_atsuAdditionalQDStyles;
         Fixed atsuSize = IntToFixed( m_info.m_pointSize );
         ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
         FMFontStyle addQDStyle = m_info.m_atsuAdditionalQDStyles;
-        ATSUAttributeValuePtr    atsuValues[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] =
+        ATSUAttributeValuePtr    atsuValues[WXSIZEOF(atsuTags)] =
         {
             &m_info.m_atsuFontID ,
             &atsuSize ,
         {
             &m_info.m_atsuFontID ,
             &atsuSize ,
@@ -463,18 +474,22 @@ void wxFontRefData::MacFindFont()
 
         status = ::ATSUSetAttributes(
                                      (ATSUStyle)m_macATSUStyle,
 
         status = ::ATSUSetAttributes(
                                      (ATSUStyle)m_macATSUStyle,
-                                     sizeof(atsuTags) / sizeof(ATSUAttributeTag) ,
+                                     WXSIZEOF(atsuTags),
                                      atsuTags, atsuSizes, atsuValues);
 
         wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
                                      atsuTags, atsuSizes, atsuValues);
 
         wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
-        return;
+        if ( m_cgFont.get() == NULL )
+        {
+            ATSFontRef fontRef = FMGetATSFontRefFromFont(m_info.m_atsuFontID);
+            m_cgFont.reset( CGFontCreateWithPlatformFont( &fontRef ) );
+        }
     }
 #endif
 #if wxOSX_USE_COCOA
     }
 #endif
 #if wxOSX_USE_COCOA
-    m_nsFont = wxFont::CreateNSFont( &m_info );
+    m_nsFont = wxFont::OSXCreateNSFont( &m_info );
 #endif
 #if wxOSX_USE_IPHONE
 #endif
 #if wxOSX_USE_IPHONE
-    m_uiFont = wxFont::CreateUIFont( &m_info );
+    m_uiFont = wxFont::OSXCreateUIFont( &m_info );
 #endif
     m_fontValid = true;
 }
 #endif
     m_fontValid = true;
 }
@@ -564,6 +579,14 @@ wxFont::~wxFont()
 {
 }
 
 {
 }
 
+void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
+{
+    UnRef();
+    
+    m_refData = new wxFontRefData( info);
+}
+
+
 bool wxFont::RealizeResource()
 {
     M_FONTDATA->MacFindFont();
 bool wxFont::RealizeResource()
 {
     M_FONTDATA->MacFindFont();
@@ -750,7 +773,7 @@ wxUint16 wxFont::MacGetThemeFontID() const
 
 #endif
 
 
 #endif
 
-#if wxOSX_USE_CORE_TEXT || wxOSX_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
 void * wxFont::MacGetATSUStyle() const
 {
     wxCHECK_MSG( M_FONTDATA != NULL , NULL, wxT("invalid font") );
 void * wxFont::MacGetATSUStyle() const
 {
     wxCHECK_MSG( M_FONTDATA != NULL , NULL, wxT("invalid font") );
@@ -760,11 +783,34 @@ void * wxFont::MacGetATSUStyle() const
     
     return M_FONTDATA->m_macATSUStyle;
 }
     
     return M_FONTDATA->m_macATSUStyle;
 }
+
+#if WXWIN_COMPATIBILITY_2_8
+wxUint32 wxFont::MacGetATSUFontID() const 
+{
+    wxCHECK_MSG( M_FONTDATA != NULL, 0, wxT("invalid font") );
+
+    // cast away constness otherwise lazy font resolution is not possible
+    const_cast<wxFont *>(this)->RealizeResource();
+    
+    return M_FONTDATA->m_info.m_atsuFontID;
+}
+
+wxUint32 wxFont::MacGetATSUAdditionalQDStyles() const
+{
+    wxCHECK_MSG( M_FONTDATA != NULL, 0, wxT("invalid font") );
+
+    // cast away constness otherwise lazy font resolution is not possible
+    const_cast<wxFont *>(this)->RealizeResource();
+    
+    return M_FONTDATA->m_info.m_atsuAdditionalQDStyles;
+}
+#endif
+
 #endif
 
 #if wxOSX_USE_CORE_TEXT
 
 #endif
 
 #if wxOSX_USE_CORE_TEXT
 
-CTFontRef wxFont::GetCTFont() const
+CTFontRef wxFont::OSXGetCTFont() const
 {
     wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
 
 {
     wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
 
@@ -776,9 +822,24 @@ CTFontRef wxFont::GetCTFont() const
 
 #endif
 
 
 #endif
 
+#if wxOSX_USE_COCOA_OR_CARBON
+
+CGFontRef wxFont::OSXGetCGFont() const
+{
+    wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
+
+    // cast away constness otherwise lazy font resolution is not possible
+    const_cast<wxFont *>(this)->RealizeResource();
+    
+    return (M_FONTDATA->m_cgFont);
+}
+
+#endif
+
+
 #if wxOSX_USE_COCOA
 
 #if wxOSX_USE_COCOA
 
-NSFont* wxFont::GetNSFont() const
+NSFont* wxFont::OSXGetNSFont() const
 {
     wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
 
 {
     wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") );
 
@@ -881,9 +942,6 @@ void wxNativeFontInfo::Init()
 #endif
 #if wxOSX_USE_COCOA
     m_nsFontDescriptor = NULL;
 #endif
 #if wxOSX_USE_COCOA
     m_nsFontDescriptor = NULL;
-#endif
-#if wxOSX_USE_IPHONE
-    m_uiFontDescriptor = NULL;
 #endif
     m_pointSize = 0;
     m_family = wxFONTFAMILY_DEFAULT;
 #endif
     m_pointSize = 0;
     m_family = wxFONTFAMILY_DEFAULT;
@@ -891,7 +949,7 @@ void wxNativeFontInfo::Init()
     m_weight = wxFONTWEIGHT_NORMAL;
     m_underlined = false;
     m_faceName.clear();
     m_weight = wxFONTWEIGHT_NORMAL;
     m_underlined = false;
     m_faceName.clear();
-    m_encoding = wxFONTENCODING_DEFAULT;
+    m_encoding = wxFont::GetDefaultEncoding();
     m_descriptorValid = false;
 }
 
     m_descriptorValid = false;
 }
 
@@ -969,6 +1027,11 @@ void wxNativeFontInfo::EnsureValid()
 #if wxOSX_USE_ATSU_TEXT
     if ( !m_atsuFontValid )
     {
 #if wxOSX_USE_ATSU_TEXT
     if ( !m_atsuFontValid )
     {
+#if !wxOSX_USE_CARBON
+        // not needed outside
+        wxInt16 m_qdFontFamily;
+        wxInt16 m_qdFontStyle;
+#endif
         wxCFStringRef cf( m_faceName, wxLocale::GetSystemEncoding() );
         ATSFontFamilyRef atsfamily = ATSFontFamilyFindFromName( cf , kATSOptionFlagsDefault );
         if ( atsfamily == (ATSFontFamilyRef) -1 )
         wxCFStringRef cf( m_faceName, wxLocale::GetSystemEncoding() );
         ATSFontFamilyRef atsfamily = ATSFontFamilyFindFromName( cf , kATSOptionFlagsDefault );
         if ( atsfamily == (ATSFontFamilyRef) -1 )
@@ -995,14 +1058,17 @@ void wxNativeFontInfo::EnsureValid()
         // ATSUFontID and FMFont are equivalent
         FMFontStyle intrinsicStyle = 0 ;
         OSStatus status = FMGetFontFromFontFamilyInstance( m_qdFontFamily , m_qdFontStyle , (FMFont*)&m_atsuFontID , &intrinsicStyle);
         // ATSUFontID and FMFont are equivalent
         FMFontStyle intrinsicStyle = 0 ;
         OSStatus status = FMGetFontFromFontFamilyInstance( m_qdFontFamily , m_qdFontStyle , (FMFont*)&m_atsuFontID , &intrinsicStyle);
-        wxASSERT_MSG( status == noErr , wxT("couldn't get an ATSUFont from font family") );
+        if ( status != noErr )
+        {
+            wxFAIL_MSG( wxT("couldn't get an ATSUFont from font family") );
+        }
         m_atsuAdditionalQDStyles = m_qdFontStyle & (~intrinsicStyle );
         m_atsuFontValid = true;
     }
 #endif
 #if wxOSX_USE_COCOA
     if ( m_nsFontDescriptor == NULL )
         m_atsuAdditionalQDStyles = m_qdFontStyle & (~intrinsicStyle );
         m_atsuFontValid = true;
     }
 #endif
 #if wxOSX_USE_COCOA
     if ( m_nsFontDescriptor == NULL )
-        ValidateNSFontDescriptor();
+        OSXValidateNSFontDescriptor();
 #endif
 #if wxOSX_USE_IPHONE
     // TODO
 #endif
 #if wxOSX_USE_IPHONE
     // TODO
@@ -1027,9 +1093,6 @@ void wxNativeFontInfo::Init(const wxNativeFontInfo& info)
 #endif
 #if wxOSX_USE_COCOA
     m_nsFontDescriptor = (NSFontDescriptor*) wxMacCocoaRetain(info.m_nsFontDescriptor);
 #endif
 #if wxOSX_USE_COCOA
     m_nsFontDescriptor = (NSFontDescriptor*) wxMacCocoaRetain(info.m_nsFontDescriptor);
-#endif
-#if wxOSX_USE_IPHONE
-    m_uiFontDescriptor = wxMacCocoaRetain(info.m_uiFontDescriptor);;
 #endif
     m_pointSize = info.m_pointSize;
     m_family = info.m_family;
 #endif
     m_pointSize = info.m_pointSize;
     m_family = info.m_family;
@@ -1056,6 +1119,8 @@ void wxNativeFontInfo::Init(int size,
     m_weight = weight;
     m_underlined = underlined;
     m_faceName = faceName;
     m_weight = weight;
     m_underlined = underlined;
     m_faceName = faceName;
+    if ( encoding == wxFONTENCODING_DEFAULT )
+        encoding = wxFont::GetDefaultEncoding();
     m_encoding = encoding;
 
 }
     m_encoding = encoding;
 
 }
@@ -1074,10 +1139,6 @@ void wxNativeFontInfo::Free()
 #if wxOSX_USE_COCOA
     wxMacCocoaRelease(m_nsFontDescriptor);
     m_nsFontDescriptor = NULL;
 #if wxOSX_USE_COCOA
     wxMacCocoaRelease(m_nsFontDescriptor);
     m_nsFontDescriptor = NULL;
-#endif
-#if wxOSX_USE_IPHONE
-    wxMacCocoaRelease(m_uiFontDescriptor);
-    m_uiFontDescriptor = NULL
 #endif
     m_descriptorValid = false;
 }
 #endif
     m_descriptorValid = false;
 }
@@ -1086,7 +1147,7 @@ bool wxNativeFontInfo::FromString(const wxString& s)
 {
     long l;
 
 {
     long l;
 
-    wxStringTokenizer tokenizer(s, _T(";"));
+    wxStringTokenizer tokenizer(s, wxT(";"));
 
     wxString token = tokenizer.GetNextToken();
     //
 
     wxString token = tokenizer.GetNextToken();
     //
@@ -1137,7 +1198,7 @@ wxString wxNativeFontInfo::ToString() const
 {
     wxString s;
 
 {
     wxString s;
 
-    s.Printf(_T("%d;%d;%d;%d;%d;%d;%s;%d"),
+    s.Printf(wxT("%d;%d;%d;%d;%d;%d;%s;%d"),
              0,                                 // version
              m_pointSize,
              m_family,
              0,                                 // version
              m_pointSize,
              m_family,
@@ -1244,6 +1305,8 @@ void wxNativeFontInfo::SetFamily(wxFontFamily family_)
 
 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding_)
 {
 
 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding_)
 {
+    if ( encoding_ == wxFONTENCODING_DEFAULT )
+        encoding_ = wxFont::GetDefaultEncoding();
     m_encoding = encoding_;
     // not reflected in native descriptors
     m_encoding = encoding_;
     // not reflected in native descriptors
-}
\ No newline at end of file
+}