]> git.saurik.com Git - wxWidgets.git/commitdiff
better windows painting in wxMGL
authorVáclav Slavík <vslavik@fastmail.fm>
Sat, 13 Oct 2001 22:49:57 +0000 (22:49 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sat, 13 Oct 2001 22:49:57 +0000 (22:49 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11976 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/mgl/dc.cpp
src/mgl/dcclient.cpp
src/mgl/toplevel.cpp
src/mgl/utils.cpp
src/mgl/window.cpp

index 551f5420192001126b2134037d3d260e76ec76c7..203e37aa77a4ba8a0241aa8d5d38d51abc8010d7 100644 (file)
@@ -182,16 +182,9 @@ void wxDC::SetMGLDC(MGLDevCtx *mgldc, bool OwnsMGLDC)
     m_MGLDC = mgldc;
     m_OwnsMGLDC = OwnsMGLDC;
        m_ok = TRUE;
     m_MGLDC = mgldc;
     m_OwnsMGLDC = OwnsMGLDC;
        m_ok = TRUE;
-    
-    if ( mgldc->getDC()->a.clipRegion )
-    {
-        MGLRegion clip;
-        mgldc->getClipRegion(clip);
-        m_globalClippingRegion = wxRegion(clip);
-        // FIXME_MGL -- reuse wxWindows::m_updateRegion ?
-        m_currentClippingRegion = m_globalClippingRegion;
-        m_clipping = TRUE;
-    }
+
+    if ( !m_globalClippingRegion.IsNull() )
+        SetClippingRegion(m_globalClippingRegion);
     
     InitializeMGLDC();
 }
     
     InitializeMGLDC();
 }
@@ -288,7 +281,7 @@ void wxDC::DestroyClippingRegion()
     }
     else
     {
     }
     else
     {
-        m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex(), m_MGLDC->sizey()));
+        m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex()+1, m_MGLDC->sizey()+1));
         m_clipping = FALSE;
         m_currentClippingRegion.Clear();
     }
         m_clipping = FALSE;
         m_currentClippingRegion.Clear();
     }
@@ -1370,8 +1363,8 @@ wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
 
 void wxDC::DoGetSize(int *w, int *h) const
 {
 
 void wxDC::DoGetSize(int *w, int *h) const
 {
-    if (w) *w = m_MGLDC->sizex();
-    if (h) *h = m_MGLDC->sizey();
+    if (w) *w = m_MGLDC->sizex()+1;
+    if (h) *h = m_MGLDC->sizey()+1;
 }
 
 void wxDC::DoGetSizeMM(int *width, int *height) const
 }
 
 void wxDC::DoGetSizeMM(int *width, int *height) const
index 8edae04c3b05fecff9dd1ab4ae01a8d0cad90f73..54ade252ffb760a6d05c6c011a298762cb6f73dd 100644 (file)
@@ -35,12 +35,20 @@ wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win)
     if ( dc )
     {
         m_inPaintHandler = TRUE;
     if ( dc )
     {
         m_inPaintHandler = TRUE;
+
+        m_globalClippingRegion = win->GetUpdateRegion();
         SetMGLDC(dc, FALSE);
     }
     else
     {
         m_inPaintHandler = FALSE;
         SetMGLDC(dc, FALSE);
     }
     else
     {
         m_inPaintHandler = FALSE;
-        SetMGLDC(new MGLDevCtx(MGL_wmBeginPaint(m_wnd->GetHandle())), TRUE);
+
+        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()
         // TRUE means that dtor will delete MGLDevCtx object
         // but it won't destroy MGLDC returned by MGL_wmBeginPaint because
         // ~MGLDevCtx() doesn't call destroy()
@@ -49,14 +57,7 @@ wxWindowDC::wxWindowDC(wxWindow *win) : m_wnd(win)
 
 wxWindowDC::~wxWindowDC()
 {
 
 wxWindowDC::~wxWindowDC()
 {
-    if ( m_inPaintHandler )
-    {
-        // This is neccessary so that subsequently created wxPaintDCs won't get
-        // confused about clipping. Another reason is that the same MGL dc is reused
-        // for wxEraseEvent, wxNcPaintEvent and wxPaintEvent
-        DestroyClippingRegion();
-    }
-    else
+    if ( !m_inPaintHandler )
     {
         GetMGLDC()->setDC(NULL);
         MGL_wmEndPaint(m_wnd->GetHandle());
     {
         GetMGLDC()->setDC(NULL);
         MGL_wmEndPaint(m_wnd->GetHandle());
@@ -66,6 +67,6 @@ wxWindowDC::~wxWindowDC()
 wxClientDC::wxClientDC(wxWindow *win) : wxWindowDC(win)
 {
     wxRect r = m_wnd->GetClientRect();
 wxClientDC::wxClientDC(wxWindow *win) : wxWindowDC(win)
 {
     wxRect r = m_wnd->GetClientRect();
-    SetClippingRegion(r);
+    m_globalClippingRegion.Intersect(r);
     SetDeviceOrigin(r.x, r.y);
 }
     SetDeviceOrigin(r.x, r.y);
 }
index 595b1a828b7eec4cfeb62b9d258b3dcb9f912a27..3f2bbcd209f4d9f904cb33430b9fa8cf3dcf32b8 100644 (file)
@@ -77,7 +77,10 @@ bool wxTopLevelWindowMGL::Create(wxWindow *parent,
             size.y = sizeDpy.y / 5;
     }
     
             size.y = sizeDpy.y / 5;
     }
     
-    wxWindow::Create(parent, id, pos, sizeOrig, style, name);
+    wxWindow::Create(NULL, id, pos, sizeOrig, style, name);
+    SetParent(parent);
+    if ( parent )
+        parent->AddChild(this);
 
     wxTopLevelWindows.Append(this);
 
 
     wxTopLevelWindows.Append(this);
 
index 3017bbf4f3c7b0141440449a47a4cd15ff17f044..e3c3c53606e80b16d0bcdb4bb1daa35ed27f759d 100644 (file)
@@ -43,17 +43,17 @@ void wxBell()
 void wxDisplaySize(int *width, int *height)
 {
     wxASSERT_MSG( g_displayDC, wxT("MGL display DC not created yet.") );
 void wxDisplaySize(int *width, int *height)
 {
     wxASSERT_MSG( g_displayDC, wxT("MGL display DC not created yet.") );
-    if (width) *width = g_displayDC->sizex();
-    if (height) *height = g_displayDC->sizey();
+    if (width) *width = g_displayDC->sizex()+1;
+    if (height) *height = g_displayDC->sizey()+1;
 }
 
 void wxDisplaySizeMM(int *width, int *height)
 {
     wxASSERT_MSG( g_displayDC, wxT("MGL display DC not created yet.") );
     if ( width ) 
 }
 
 void wxDisplaySizeMM(int *width, int *height)
 {
     wxASSERT_MSG( g_displayDC, wxT("MGL display DC not created yet.") );
     if ( width ) 
-        *width = g_displayDC->sizex() * 25/72;
+        *width = (g_displayDC->sizex()+1) * 25/72;
     if ( height ) 
     if ( height ) 
-        *height = g_displayDC->sizey() * 25/72;
+        *height = (g_displayDC->sizey()+1) * 25/72;
     // FIXME_MGL -- what about returning *real* monitor dimensions?
 }
 
     // FIXME_MGL -- what about returning *real* monitor dimensions?
 }
 
index 55dfa752910664e2247fc9e22287dd00f21f82cc..d03dfa66bda9cc30f31162ac771747da2a998ccd 100644 (file)
@@ -1098,6 +1098,12 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
         return;
     }
     
         return;
     }
     
+#if 0 // FIXME_MGL -- debugging stuff!
+    dc->setColorRGB(255,0,255);
+    dc->fillRect(-1000,-1000,2000,2000);
+    wxUsleep(100);
+#endif
+
     MGLRegion clip;
     dc->getClipRegion(clip);
     m_updateRegion = wxRegion(clip);
     MGLRegion clip;
     dc->getClipRegion(clip);
     m_updateRegion = wxRegion(clip);