]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
#include "wx/settings.h" wxSystemSettings is needed by non-OSX code.
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 53ab8a3f7fbe5f69208c547e13847cd47a7e0628..4e570147ca74251bc009afe01c853ec9da7599f1 100644 (file)
@@ -79,8 +79,7 @@ public :
     wxMacFastPortSetter( const wxDC *dc ) 
     {
            wxASSERT( dc->Ok() ) ;
-           GetPort( &m_oldPort ) ;
-           SetPort( (GrafPtr) dc->m_macPort ) ;
+           m_swapped = QDSwapPort( (GrafPtr) dc->m_macPort , &m_oldPort ) ;
            m_clipRgn = NewRgn() ;
            GetClip( m_clipRgn ) ;
            m_dc = dc ;
@@ -88,13 +87,15 @@ public :
     }
     ~wxMacFastPortSetter()
     {
-        SetPort( (GrafPtr) m_dc->m_macPort ) ;
+        // SetPort( (GrafPtr) m_dc->m_macPort ) ;
         SetClip( m_clipRgn ) ;
-           SetPort( m_oldPort ) ;
+        if ( m_swapped )
+               SetPort( m_oldPort ) ;
            m_dc->MacCleanupPort( NULL ) ;
            DisposeRgn( m_clipRgn ) ;
     }
 private :
+    bool m_swapped ;
     RgnHandle m_clipRgn ;
     GrafPtr m_oldPort ;
     const wxDC*   m_dc ;
@@ -107,6 +108,7 @@ typedef wxMacPortSetter wxMacFastPortSetter ;
 wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) :
     wxMacPortSaver( (GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) )
 {
+    m_newPort =(GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) ;
     m_formerClip = NewRgn() ;
     m_newClip = NewRgn() ;
     GetClip( m_formerClip ) ;
@@ -126,11 +128,26 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) :
 
 wxMacWindowClipper::~wxMacWindowClipper() 
 {
+    SetPort( m_newPort ) ;
     SetClip( m_formerClip ) ;
     DisposeRgn( m_newClip ) ;
     DisposeRgn( m_formerClip ) ;
 }
 
+wxMacWindowStateSaver::wxMacWindowStateSaver( const wxWindow* win ) :
+    wxMacWindowClipper( win )
+{
+    // the port is already set at this point
+    m_newPort =(GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) ;
+    GetThemeDrawingState( &m_themeDrawingState ) ;
+}
+
+wxMacWindowStateSaver::~wxMacWindowStateSaver() 
+{
+    SetPort( m_newPort ) ;
+    SetThemeDrawingState( m_themeDrawingState , true ) ;
+}
+
 //-----------------------------------------------------------------------------
 // Local functions
 //-----------------------------------------------------------------------------
@@ -495,7 +512,7 @@ void wxDC::DestroyClippingRegion()
 {
     wxMacFastPortSetter helper(this) ;
     CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
-    m_clipping = FALSE;
+    ResetClipping();
 }
 
 void wxDC::DoGetSizeMM( int* width, int* height ) const
@@ -614,10 +631,9 @@ void wxDC::ComputeScaleAndOrigin()
     {
         // this is a bit artificial, but we need to force wxDC to think
         // the pen has changed
-        wxPen* pen = & GetPen();
-        wxPen tempPen;
-        m_pen = tempPen;
-        SetPen(* pen);
+        wxPen pen(GetPen());
+        m_pen = wxNullPen;
+        SetPen(pen);
     }
 }
 
@@ -765,8 +781,8 @@ void  wxDC::DoCrossHair( wxCoord x, wxCoord y )
 static double wxConvertWXangleToMACangle(double angle)
 {
     double newAngle = 90 - angle ;
-    if ( newAngle < 0 )
-        newAngle += 360 ;
+    while ( newAngle > 360 ) newAngle -= 360 ;
+    while ( newAngle < 0 ) newAngle += 360 ;
     return newAngle ;
 }
 
@@ -807,9 +823,8 @@ void  wxDC::DoDrawArc( wxCoord x1, wxCoord y1,
     }
     wxCoord alpha2 = wxCoord(radius2 - radius1);
     wxCoord alpha1 = wxCoord(wxConvertWXangleToMACangle(radius1));
-    if( (xx1 > xx2) || (yy1 > yy2) ) {
-        alpha2 *= -1;
-    }
+    while( alpha2 < 0 ) alpha2 += 360 ;
+    alpha2 = -alpha2 ;
     Rect r = { yyc - rad, xxc - rad, yyc + rad, xxc + rad };
     if(m_brush.GetStyle() != wxTRANSPARENT) {
         MacInstallBrush();
@@ -1305,17 +1320,12 @@ inline int    FixedToInt( Fixed inFixed )
 void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
                               double angle)
 {
+    // TODO support text background color (only possible by hand, ATSUI does not support it)
     wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText  Invalid window dc") );
-/*
-    if (angle == 0.0 )
-    {
-        DrawText(str, x, y);
-        return;
-    }
 
     if ( str.Length() == 0 )
         return ;
-*/      
+
     wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
 
@@ -1328,15 +1338,33 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     OSStatus status = noErr ;
     ATSUTextLayout atsuLayout ;
     UniCharCount chars = str.Length() ;
+    UniChar* ubuf = NULL ;
+#if SIZEOF_WCHAR_T == 4
+       wxMBConvUTF16BE converter ;
 #if wxUSE_UNICODE
-    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
-        &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
+       size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ;
+       ubuf = (UniChar*) malloc( unicharlen + 2 ) ;
+       converter.WC2MB( (char*) ubuf , str.wc_str(), unicharlen + 2 ) ;
+#else
+    const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ;
+       size_t unicharlen = converter.WC2MB( NULL , wchar.data()  , 0 ) ;
+       ubuf = (UniChar*) malloc( unicharlen + 2 ) ;
+       converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 ) ;
+#endif
+    chars = unicharlen / 2 ;
+#else
+#if wxUSE_UNICODE
+    ubuf = (UniChar*) str.wc_str() ;
 #else
     wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ;
-    int wlen = wxWcslen( wchar.data() ) ;
-    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) wchar.data() , 0 , wlen , wlen , 1 ,
-        &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
+    chars = wxWcslen( wchar.data() ) ;
+    ubuf = (UniChar*) wchar.data() ;
+#endif
 #endif
+
+    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) ubuf , 0 , chars , chars , 1 ,
+        &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
+
     wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
     int iAngle = int( angle );
     int drawX = XLOG2DEVMAC(x) ;
@@ -1382,6 +1410,9 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) );
     CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) );
     ::ATSUDisposeTextLayout(atsuLayout);
+#if SIZEOF_WCHAR_T == 4
+    free( ubuf ) ;
+#endif
 }
 
 void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
@@ -1397,12 +1428,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
         useDrawThemeText = false ;
 #endif
     MacInstallFont() ;
-    if ( 0 )
-    {
-        m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
-        SetAntiAliasedTextEnabled(true, 8);
-        m_macAliasWasEnabled = true ;
-    }
+
     FontInfo fi ;
     ::GetFontInfo( &fi ) ;
 #if TARGET_CARBON
@@ -1454,14 +1480,6 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
 #endif
         {
             wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
-            if ( m_backgroundMode != wxTRANSPARENT )
-            {
-                Rect frame = { yy - fi.ascent + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy - fi.ascent + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
-                short width = ::TextWidth( text , 0 , strlen(text) ) ;
-                frame.right = frame.left + width ;
-
-                ::EraseRect( &frame ) ;
-            }
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
@@ -1664,6 +1682,11 @@ void wxDC::MacInstallFont() const
     //        return ;
     Pattern blackColor ;
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
+    if ( m_backgroundMode != wxTRANSPARENT )
+    {
+        Pattern whiteColor ;
+        ::BackPat(GetQDGlobalsWhite(&whiteColor));
+    }
     if ( m_font.Ok() )
     {
         ::TextFont( m_font.MacGetFontNum() ) ;