]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dc.cpp
Fixed DDE memory leaks.
[wxWidgets.git] / src / mac / dc.cpp
index edfaa69506e051cd1971a41aecb7123c6d202a03..15bf719bd15ef4c5b54a59e243a5a109b74ed8a0 100644 (file)
@@ -55,6 +55,8 @@ const double RAD2DEG  = 180.0 / M_PI;
 const short kEmulatedMode = -1 ;
 const short kUnsupportedMode = -2 ;
 
 const short kEmulatedMode = -1 ;
 const short kUnsupportedMode = -2 ;
 
+extern TECObjectRef s_TECNativeCToUnicode ;
+
 // set to 0 if problems arise
 #define wxMAC_EXPERIMENTAL_DC 1
 
 // set to 0 if problems arise
 #define wxMAC_EXPERIMENTAL_DC 1
 
@@ -79,15 +81,21 @@ public :
            wxASSERT( dc->Ok() ) ;
            GetPort( &m_oldPort ) ;
            SetPort( (GrafPtr) dc->m_macPort ) ;
            wxASSERT( dc->Ok() ) ;
            GetPort( &m_oldPort ) ;
            SetPort( (GrafPtr) dc->m_macPort ) ;
+           m_clipRgn = NewRgn() ;
+           GetClip( m_clipRgn ) ;
            m_dc = dc ;
            dc->MacSetupPort( NULL ) ;
     }
     ~wxMacFastPortSetter()
     {
            m_dc = dc ;
            dc->MacSetupPort( NULL ) ;
     }
     ~wxMacFastPortSetter()
     {
+        SetPort( (GrafPtr) m_dc->m_macPort ) ;
+        SetClip( m_clipRgn ) ;
            SetPort( m_oldPort ) ;
            m_dc->MacCleanupPort( NULL ) ;
            SetPort( m_oldPort ) ;
            m_dc->MacCleanupPort( NULL ) ;
+           DisposeRgn( m_clipRgn ) ;
     }
 private :
     }
 private :
+    RgnHandle m_clipRgn ;
     GrafPtr m_oldPort ;
     const wxDC*   m_dc ;
 } ;
     GrafPtr m_oldPort ;
     const wxDC*   m_dc ;
 } ;
@@ -96,6 +104,30 @@ private :
 typedef wxMacPortSetter wxMacFastPortSetter ;
 #endif
 
 typedef wxMacPortSetter wxMacFastPortSetter ;
 #endif
 
+#if 0
+
+// start moving to a dual implementation for QD and CGContextRef
+
+class wxMacGraphicsContext
+{
+public :
+    void DrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask ) = 0 ;
+    void SetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) = 0 ;
+    void SetClippingRegion( const wxRegion &region  ) = 0 ;
+    void DestroyClippingRegion() = 0 ;
+    void SetTextForeground( const wxColour &col ) = 0 ;
+    void SetTextBackground( const wxColour &col ) = 0 ;
+    void SetLogicalScale( double x , double y ) = 0 ;
+    void SetUserScale( double x , double y ) = 0;
+} ;
+
+class wxMacQuickDrawContext : public wxMacGraphicsContext
+{
+public :
+} ;
+
+#endif
+
 wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) 
 {
     m_formerClip = NewRgn() ;
 wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) 
 {
     m_formerClip = NewRgn() ;
@@ -1339,11 +1371,10 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
 
     wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
 
-    wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
     if ( 0 )
     {
         m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
     if ( 0 )
     {
         m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
-        SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * font->m_macFontSize));
+        SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * m_font.GetMacFontSize()));
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
@@ -1353,24 +1384,9 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #else
     status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #else
-    TECObjectRef ec;
-    status = TECCreateConverter(&ec,
-                                wxApp::s_macDefaultEncodingIsPC
-                                    ? (int)kTextEncodingWindowsLatin1
-                                    : (int)kTextEncodingMacRoman,
-                                kTextEncodingUnicodeDefault);
-        
-    wxASSERT_MSG( status == noErr , wxT("couldn't start converter") ) ;
-    ByteCount byteOutLen ;
-    ByteCount byteInLen = str.Length() ;
-    ByteCount byteBufferLen = byteInLen *2 ;
-    char* buf = new char[byteBufferLen] ;
-    status = TECConvertText(ec, (ConstTextPtr)str.c_str() , byteInLen, &byteInLen,
-        (TextPtr)buf, byteBufferLen, &byteOutLen);
-    wxASSERT_MSG( status == noErr , wxT("couldn't convert text") ) ;
-    status = TECDisposeConverter(ec);
-    wxASSERT_MSG( status == noErr , wxT("couldn't dispose converter") ) ;
-    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) buf , 0 , byteOutLen / 2 , byteOutLen / 2 , 1 ,
+    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 ) ;
 #endif
     wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #endif
     wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
@@ -1418,10 +1434,6 @@ 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);
     CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) );
     CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) );
     ::ATSUDisposeTextLayout(atsuLayout);
-#if wxUSE_UNICODE
-#else
-    delete[] buf ;
-#endif
 }
 
 void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
 }
 
 void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
@@ -1501,7 +1513,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                 else
 #endif
                 {
                 else
 #endif
                 {
-                    wxCharBuffer text = wxMacStringToCString(linetext) ; 
+                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
                     ::DrawText( text , 0 , strlen(text) ) ;
                     line++ ;
                     ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
                     ::DrawText( text , 0 , strlen(text) ) ;
                     line++ ;
                     ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
@@ -1543,7 +1555,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
         else
 #endif
         {
         else
 #endif
         {
-            wxCharBuffer text = wxMacStringToCString(linetext) ; 
+            wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
@@ -1583,21 +1595,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
     int length = strtext.Length() ;
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
     int length = strtext.Length() ;
-    /*
-    const char *text = NULL ;
-    wxString macText ;
-    if ( wxApp::s_macDefaultEncodingIsPC )
-    {
-        macText = wxMacMakeMacStringFromPC( string ) ;
-        text = macText ;
-        length = macText.Length() ;
-    } 
-    else
-    {
-        text = string ;
-        length = string.Length() ;
-    }
-    */
+
     int laststop = 0 ;
     int i = 0 ;
     int curwidth = 0 ;
     int laststop = 0 ;
     int i = 0 ;
     int curwidth = 0 ;
@@ -1628,7 +1626,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
                 else
 #endif
                 {
                 else
 #endif
                 {
-                    wxCharBuffer text = wxMacStringToCString(linetext) ; 
+                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
                     curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
                 }
                 if ( curwidth > *width )
                     curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
                 }
                 if ( curwidth > *width )
@@ -1656,7 +1654,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
         else
 #endif
         {
         else
 #endif
         {
-            wxCharBuffer text = wxMacStringToCString(linetext) ; 
+            wxCharBuffer text = linetext.mb_str(wxConvLocal) ;  
             curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
         }
         if ( curwidth > *width )
             curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
         }
         if ( curwidth > *width )
@@ -1681,7 +1679,7 @@ wxCoord   wxDC::GetCharWidth(void) const
     if ( UMAGetSystemVersion() < 0x1000 || ((wxFont*)&m_font)->GetNoAntiAliasing() )
         useGetThemeText = false ;
 #endif
     if ( UMAGetSystemVersion() < 0x1000 || ((wxFont*)&m_font)->GetNoAntiAliasing() )
         useGetThemeText = false ;
 #endif
-    char text[] = "H" ;
+    char text[] = "g" ;
 #if TARGET_CARBON
     if ( useGetThemeText )
     {
 #if TARGET_CARBON
     if ( useGetThemeText )
     {
@@ -1736,12 +1734,11 @@ void wxDC::MacInstallFont() const
     //        return ;
     Pattern blackColor ;
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
     //        return ;
     Pattern blackColor ;
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
-    wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
-    if ( font )
+    if ( m_font.Ok() )
     {
     {
-        ::TextFont( font->m_macFontNum ) ;
-        ::TextSize( short(m_scaleY * font->m_macFontSize) ) ;
-        ::TextFace( font->m_macFontStyle ) ;
+        ::TextFont( m_font.GetMacFontNum() ) ;
+        ::TextSize( (short)(m_scaleY * m_font.GetMacFontSize()) ) ;
+        ::TextFace( m_font.GetMacFontStyle() ) ;
         m_macFontInstalled = true ;
         m_macBrushInstalled = false ;
         m_macPenInstalled = false ;
         m_macFontInstalled = true ;
         m_macBrushInstalled = false ;
         m_macPenInstalled = false ;
@@ -1810,9 +1807,9 @@ void wxDC::MacInstallFont() const
     }
     ::PenMode( mode ) ;
     OSStatus status = noErr ;
     }
     ::PenMode( mode ) ;
     OSStatus status = noErr ;
-    Fixed atsuSize = IntToFixed( int(m_scaleY * font->m_macFontSize) ) ;
-    Style qdStyle = font->m_macFontStyle ;
-    ATSUFontID    atsuFont = font->m_macATSUFontID ;
+    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.GetMacFontSize()) ) ;
+    Style qdStyle = m_font.GetMacFontStyle() ;
+    ATSUFontID    atsuFont = m_font.GetMacATSUFontID() ;
     status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
     wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
     status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
     wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
@@ -1865,18 +1862,18 @@ void wxDC::MacInstallFont() const
 
 Pattern gPatterns[] =
 {   // hatch patterns
 
 Pattern gPatterns[] =
 {   // hatch patterns
-    { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } ,
-    { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } ,
-    { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } ,
-    { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } ,
-    { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } ,
-    { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } ,
-    { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } ,
+    { { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } } ,
+    { { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } } ,
+    { { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } } ,
+    { { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } } ,
+    { { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } } ,
+    { { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } } ,
+    { { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } } ,
     // dash patterns
     // dash patterns
-    { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } , // DOT
-    { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } , // LONG_DASH
-    { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } , // SHORT_DASH
-    { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } , // DOT_DASH
+    { { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } } , // DOT
+    { { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } } , // LONG_DASH
+    { { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } } , // SHORT_DASH
+    { { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } } , // DOT_DASH
 } ;
 
 static void wxMacGetPattern(int penStyle, Pattern *pattern)
 } ;
 
 static void wxMacGetPattern(int penStyle, Pattern *pattern)
@@ -1903,7 +1900,7 @@ static void wxMacGetPattern(int penStyle, Pattern *pattern)
 void wxDC::MacInstallPen() const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void wxDC::MacInstallPen() const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    Pattern     blackColor;
+    //Pattern     blackColor;
     //    if ( m_macPenInstalled )
     //        return ;
     RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());
     //    if ( m_macPenInstalled )
     //        return ;
     RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());