X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4bbc9f720cbd99d7092e8944e671a6291068b13..21b9b5e2925776b0b63a4f44558d325351013a0b:/src/mgl/dcclient.cpp diff --git a/src/mgl/dcclient.cpp b/src/mgl/dcclient.cpp index f3bef5fbd7..d238dbc95c 100644 --- a/src/mgl/dcclient.cpp +++ b/src/mgl/dcclient.cpp @@ -3,11 +3,11 @@ // 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__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dcclient.h" #endif @@ -26,25 +26,49 @@ #include 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); }