]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/region.cpp
A few tweaks and cleanups
[wxWidgets.git] / src / os2 / region.cpp
index b3ff3e34d72f7903b1407761fcdc80d77cc876a9..5404bf64db3871f91175111420abec12a01513b6 100644 (file)
@@ -4,7 +4,7 @@
 // Author:    David Webster
 // Modified by:
 // Created:   10/15/99
-// RCS-ID:       $Id$
+// RCS-ID:    $Id$
 // Copyright: (c) Davdi Webster
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -19,8 +19,8 @@
 #include "wx/window.h"
 #include "wx/os2/private.h"
 
-       IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
-       IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
 
 //-----------------------------------------------------------------------------
 // wxRegionRefData implementation
@@ -31,6 +31,7 @@ public:
     wxRegionRefData()
     {
         m_hRegion = 0;
+        m_hPS     = 0;
     }
 
     wxRegionRefData(const wxRegionRefData& rData)
@@ -89,11 +90,13 @@ wxRegion::wxRegion()
 } // end of wxRegion::wxRegion
 
 wxRegion::wxRegion(
-  WXHRGN                            hRegion
+  WXHRGN                            hRegion,
+  WXHDC                             hPS
 )
 {
     m_refData = new wxRegionRefData;
     M_REGION = (HRGN) hRegion;
+    (((wxRegionRefData*)m_refData)->m_hPS) = hPS;
 } // end of wxRegion::wxRegion
 
 wxRegion::wxRegion(
@@ -217,10 +220,44 @@ wxRegion::~wxRegion()
 {
 } // end of wxRegion::~wxRegion
 
+wxObjectRefData *wxRegion::CreateData() const
+{
+    return new wxRegionRefData;
+}
+
+wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const
+{
+    return new wxRegionRefData(*(wxRegionRefData *)data);
+}
+
 //-----------------------------------------------------------------------------
 //# Modify region
 //-----------------------------------------------------------------------------
 
+bool wxRegion::Offset(
+  wxCoord                           x
+, wxCoord                           y
+)
+{
+    if ( !x && !y )
+    {
+        // nothing to do
+        return TRUE;
+    }
+
+    AllocExclusive();
+
+#if 0
+    if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
+    {
+        wxLogLastError(_T("OffsetRgn"));
+
+        return FALSE;
+    }
+#endif
+    return TRUE;
+}
+
 //
 // Clear current region
 //
@@ -240,20 +277,7 @@ bool wxRegion::Combine(
 , wxRegionOp                        eOp
 )
 {
-    //
-    // Don't change shared data
-    //
-    if (!m_refData)
-    {
-        m_refData = new wxRegionRefData();
-    }
-    else if (m_refData->GetRefCount() > 1)
-    {
-        wxRegionRefData*            pRef = (wxRegionRefData*)m_refData;
-
-        UnRef();
-        m_refData = new wxRegionRefData(*pRef);
-    }
+    AllocExclusive();
 
     //
     // If ref count is 1, that means it's 'ours' anyway so no action.
@@ -318,20 +342,7 @@ bool wxRegion::Combine(
     if (rRegion.Empty())
         return FALSE;
 
-    //
-    // Don't change shared data
-    //
-    if (!m_refData)
-    {
-        m_refData = new wxRegionRefData();
-    }
-    else  if (m_refData->GetRefCount() > 1)
-    {
-        wxRegionRefData*            pRef = (wxRegionRefData*)m_refData;
-
-        UnRef();
-        m_refData = new wxRegionRefData(*pRef);
-    }
+    AllocExclusive();
 
     LONG                            lMode = 0;
 
@@ -396,13 +407,14 @@ void wxRegion::GetBox(
     if (m_refData)
     {
         RECTL                       vRect;
+        APIRET                      rc;
 
-        ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
+        rc = ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
                             ,M_REGION
                             ,&vRect
                            );
         x       = vRect.xLeft;
-        y       = vRect.yTop;
+        y       = vRect.yBottom;
         vWidth  = vRect.xRight - vRect.xLeft;
         vHeight = vRect.yTop - vRect.yBottom;
     }