]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/region.cpp
Don't do the wx cleanup if wxPython didn't do the initialization.
[wxWidgets.git] / src / msw / region.cpp
index 0d1b81aacee2528d0bbf7790c7b86afe275d5902..ec84dd0205736ca03ebbc3742d4957689b8c1706 100644 (file)
@@ -105,6 +105,10 @@ wxRegion::wxRegion(const wxRect& rect)
 
 wxRegion::wxRegion(size_t n, const wxPoint *points, int fillStyle)
 {
+#ifdef __WXMICROWIN__
+    m_refData = NULL;
+    M_REGION = NULL;
+#else
     m_refData = new wxRegionRefData;
     M_REGION = ::CreatePolygonRgn
                (
@@ -112,16 +116,24 @@ wxRegion::wxRegion(size_t n, const wxPoint *points, int fillStyle)
                     n,
                     fillStyle == wxODDEVEN_RULE ? ALTERNATE : WINDING
                );
+#endif
 }
 
-/*
- * Destroy the region.
- */
 wxRegion::~wxRegion()
 {
     // m_refData unrefed in ~wxObject
 }
 
+wxObjectRefData *wxRegion::CreateRefData() const
+{
+    return new wxRegionRefData;
+}
+
+wxObjectRefData *wxRegion::CloneRefData(const wxObjectRefData *data) const
+{
+    return new wxRegionRefData(*(wxRegionRefData *)data);
+}
+
 //-----------------------------------------------------------------------------
 // Modify region
 //-----------------------------------------------------------------------------
@@ -132,18 +144,30 @@ void wxRegion::Clear()
     UnRef();
 }
 
+bool wxRegion::Offset(wxCoord x, wxCoord y)
+{
+    if ( !x && !y )
+    {
+        // nothing to do
+        return TRUE;
+    }
+
+    AllocExclusive();
+
+    if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
+    {
+        wxLogLastError(_T("OffsetRgn"));
+
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 // Combine rectangle (x, y, w, h) with this.
 bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRegionOp op)
 {
-    // Don't change shared data
-    if (!m_refData) {
-        m_refData = new wxRegionRefData();
-    } else if (m_refData->GetRefCount() > 1) {
-        wxRegionRefData* ref = (wxRegionRefData*)m_refData;
-        UnRef();
-        m_refData = new wxRegionRefData(*ref);
-    }
-    // If ref count is 1, that means it's 'ours' anyway so no action.
+    AllocExclusive();
 
     HRGN rectRegion = ::CreateRectRgn(x, y, x + width, y + height);
 
@@ -159,7 +183,11 @@ bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRe
             mode = RGN_COPY; break ;
     }
 
-    bool success = (ERROR != ::CombineRgn(M_REGION, M_REGION, rectRegion, mode));
+    bool success = ::CombineRgn(M_REGION, M_REGION, rectRegion, mode) != ERROR;
+    if ( !success )
+    {
+        wxLogLastError(_T("CombineRgn"));
+    }
 
     ::DeleteObject(rectRegion);
 
@@ -172,14 +200,7 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
     if (region.Empty())
         return FALSE;
 
-    // Don't change shared data
-    if (!m_refData) {
-        m_refData = new wxRegionRefData();
-    } else    if (m_refData->GetRefCount() > 1) {
-        wxRegionRefData* ref = (wxRegionRefData*)m_refData;
-        UnRef();
-        m_refData = new wxRegionRefData(*ref);
-    }
+    AllocExclusive();
 
     int mode = 0;
     switch (op)