]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
SetValue is not adding a line if values does not exist
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 49de162c0a83ef77537d4c9c2a98adc98faf880b..3084e7224c6ca38171758d40d6a6449cc8dc5d45 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 ;
@@ -511,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
@@ -630,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);
     }
 }
 
@@ -1344,15 +1344,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) ;
@@ -1398,6 +1416,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)