]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/dcclient.cpp
use wxMBConvStrictUTF8 instead of wxMBConvUTF8 in ConvertStr() and mb/wc_str()
[wxWidgets.git] / src / mgl / dcclient.cpp
index f3bef5fbd7648c6995f80e8592242149a5a8e0f0..9e3d14aa82b8e5cc9b8e99276ff98a87ba67f6ac 100644 (file)
@@ -1,16 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        dcclient.cpp
+// Name:        src/mgl/dcclient.cpp
 // Purpose:
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
-// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "dcclient.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #pragma hdrstop
 #endif
 
+#include "wx/dcclient.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/dcclient.h"
     #include "wx/window.h"
 #endif
 
 #include <mgraph.hpp>
 
 IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
-IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
 IMPLEMENT_DYNAMIC_CLASS(wxClientDC,wxWindowDC)
+IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
 
 wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win)
 {
-    MGLDC *dc = MGL_wmBeginPaint(m_wnd->GetHandle());
-    SetMGLDC(new MGLDevCtx(dc), FALSE);
-    // FIXME_MGL -- correctly handle setting device origin and
-    //              clipping regions
+    MGLDevCtx *dc = win->GetPaintMGLDC();
+
+    if ( dc )
+    {
+        m_inPaintHandler = TRUE;
+
+        m_globalClippingRegion = win->GetUpdateRegion();
+        SetMGLDC(dc, FALSE);
+    }
+    else
+    {
+        m_inPaintHandler = FALSE;
+
+        dc = new MGLDevCtx(MGL_wmBeginPaint(win->GetHandle()));
+
+        MGLRegion clip;
+        dc->getClipRegion(clip);
+        m_globalClippingRegion = wxRegion(clip);
+        SetMGLDC(dc, TRUE);
+        // TRUE means that dtor will delete MGLDevCtx object
+        // but it won't destroy MGLDC returned by MGL_wmBeginPaint because
+        // ~MGLDevCtx() doesn't call destroy()
+    }
 }
 
 wxWindowDC::~wxWindowDC()
 {
-    MGL_wmEndPaint(m_wnd->GetHandle());
+    if ( !m_inPaintHandler )
+    {
+        GetMGLDC()->setDC(NULL);
+        MGL_wmEndPaint(m_wnd->GetHandle());
+    }
 }
 
 wxClientDC::wxClientDC(wxWindow *win) : wxWindowDC(win)
 {
     wxRect r = m_wnd->GetClientRect();
-    SetClippingRegion(r);
+    m_globalClippingRegion.Intersect(r);
+    SetClippingRegion(m_globalClippingRegion);
     SetDeviceOrigin(r.x, r.y);
 }