]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/region.cpp
Moved the cleanup code to an EVT_WINDOW_DESTROY handler.
[wxWidgets.git] / src / mgl / region.cpp
index 7629ef45fce6f852a7296d87189a68bfcc7c3a39..3ec5b7d7516e270754e6ba4a60abe1d5e78288b2 100644 (file)
@@ -3,7 +3,7 @@
 // Purpose:   Region handling for wxWindows/MGL
 // 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
 /////////////////////////////////////////////////////////////////////////////
 
@@ -37,18 +37,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
 class WXDLLEXPORT wxRegionRefData : public wxGDIRefData
 {
 public:
-    wxRegionRefData()
-    {
-    }    
+    wxRegionRefData() {}
 
     wxRegionRefData(const wxRegionRefData& data)
     {
         m_region = data.m_region;
     }
 
-    ~wxRegionRefData()
-    {
-    }
+    ~wxRegionRefData() {}
 
     MGLRegion m_region;
 };
@@ -60,12 +56,22 @@ public:
 // wxRegion
 //-----------------------------------------------------------------------------
 
+wxObjectRefData *wxRegion::CreateRefData() const
+{
+    return new wxRegionRefData;
+}
+
+wxObjectRefData *wxRegion::CloneRefData(const wxObjectRefData *data) const
+{
+    return new wxRegionRefData(*(wxRegionRefData *)data);
+}
+
 /*
  * Create an empty region.
  */
 wxRegion::wxRegion()
 {
-    m_refData = (wxRegionRefData *)NULL;
+    m_refData = NULL;
 }
 
 wxRegion::wxRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
@@ -156,17 +162,24 @@ bool wxRegion::Empty() const
 // Modifications
 //-----------------------------------------------------------------------------
 
+bool wxRegion::Offset(wxCoord x, wxCoord y)
+{
+    AllocExclusive();
+    M_REGION.offset(x, y);
+    return TRUE;
+}
+
 // Union rectangle or region with this.
 bool wxRegion::Union(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
-    Unshare();
+    AllocExclusive();
     M_REGION += MGLRect(x, y, x + width, y + height);
     return TRUE;
 }
 
 bool wxRegion::Union(const wxRegion& region)
 {
-    Unshare();
+    AllocExclusive();
     M_REGION += M_REGION_OF(region);
     return TRUE;
 }
@@ -174,14 +187,14 @@ bool wxRegion::Union(const wxRegion& region)
 // Intersect rectangle or region with this.
 bool wxRegion::Intersect(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
-    Unshare();
+    AllocExclusive();
     M_REGION &= MGLRect(x, y, x + width, y + height);
     return TRUE;
 }
 
 bool wxRegion::Intersect(const wxRegion& region)
 {
-    Unshare();
+    AllocExclusive();
     M_REGION &= M_REGION_OF(region);
     return TRUE;
 }
@@ -190,14 +203,14 @@ bool wxRegion::Intersect(const wxRegion& region)
 // Combines the parts of 'this' that are not part of the second region.
 bool wxRegion::Subtract(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
-    Unshare();
+    AllocExclusive();
     M_REGION -= MGLRect(x, y, x + width, y + height);
     return TRUE;
 }
 
 bool wxRegion::Subtract(const wxRegion& region)
 {
-    Unshare();
+    AllocExclusive();
     M_REGION -= M_REGION_OF(region);
     return TRUE;
 }
@@ -205,7 +218,7 @@ bool wxRegion::Subtract(const wxRegion& region)
 // XOR: the union of two combined regions except for any overlapping areas.
 bool wxRegion::Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
-    Unshare();
+    AllocExclusive();
     MGLRect rect(x, y, x + width, y + height);
     MGLRegion rg1 = M_REGION + rect,
               rg2 = M_REGION & rect;
@@ -215,7 +228,7 @@ bool wxRegion::Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 
 bool wxRegion::Xor(const wxRegion& region)
 {
-    Unshare();
+    AllocExclusive();
     MGLRegion rg1 = M_REGION + M_REGION_OF(region),
               rg2 = M_REGION & M_REGION_OF(region);
     M_REGION = rg1 - rg2;
@@ -273,25 +286,6 @@ wxRegionContain wxRegion::Contains(const wxRect& rect) const
 }
 
 
-
-void wxRegion::Unshare()
-{
-    if (!m_refData)
-    {
-        m_refData = new wxRegionRefData();
-    }
-    else
-    {
-        wxRegionRefData* ref = new wxRegionRefData(*(wxRegionRefData*)m_refData);
-        UnRef();
-        m_refData = ref;
-    }
-}
-
-
-
-
-
 ///////////////////////////////////////////////////////////////////////////////
 //                               wxRegionIterator                                 //
 ///////////////////////////////////////////////////////////////////////////////
@@ -324,7 +318,7 @@ wxRegionIterator::wxRegionIterator(const wxRegion& region)
 
 static wxRegionRectList *gs_rectList;
 
-static void wxMGL_region_callback(const rect_t *r)
+static void MGLAPI wxMGL_region_callback(const rect_t *r)
 {
     gs_rectList->Append(new wxRect(r->left, r->top, 
                                    r->right - r->left, r->bottom - r->top));
@@ -396,4 +390,3 @@ wxCoord wxRegionIterator::GetH() const
     else
         return 0;
 }
-