]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/region.cpp
add automatic rescaling to wxArtProvider
[wxWidgets.git] / src / os2 / region.cpp
index 112fccc32f607e170238cf586a8a965a016e301d..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
 /////////////////////////////////////////////////////////////////////////////
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/app.h"
 #include "wx/os2/region.h"
 #include "wx/gdicmn.h"
 
 #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
@@ -30,6 +31,7 @@ public:
     wxRegionRefData()
     {
         m_hRegion = 0;
+        m_hPS     = 0;
     }
 
     wxRegionRefData(const wxRegionRefData& rData)
@@ -88,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(
@@ -216,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
 //
@@ -239,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.
@@ -317,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;
 
@@ -395,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;
     }
@@ -555,6 +568,51 @@ WXHRGN wxRegion::GetHRGN() const
     return (WXHRGN) M_REGION;
 }
 
+//
+// Set a new PS, this means we have to recreate the old region in the new
+// PS
+//
+void wxRegion::SetPS(
+  HPS                               hPS
+)
+{
+    RGNRECT                     vRgnData;
+    PRECTL                      pRect = NULL;
+
+    if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS
+                              ,((wxRegionRefData*)m_refData)->m_hRegion
+                              ,NULL
+                              ,&vRgnData
+                              ,NULL
+                             ))
+    {
+        pRect = new RECTL[vRgnData.crcReturned];
+        vRgnData.crc = vRgnData.crcReturned;
+        vRgnData.ircStart = 1;
+        if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS
+                                  ,((wxRegionRefData*)m_refData)->m_hRegion
+                                  ,NULL
+                                  ,&vRgnData
+                                  ,pRect
+                                 ))
+        {
+            //
+            // First destroy the region out of the old PS
+            // and then create it in the new and set the new to current
+            //
+            ::GpiDestroyRegion( ((wxRegionRefData*)m_refData)->m_hPS
+                               ,M_REGION
+                              );
+            ((wxRegionRefData*)m_refData)->m_hRegion = ::GpiCreateRegion( hPS
+                                                                         ,vRgnData.crcReturned
+                                                                         ,pRect
+                                                                        );
+            ((wxRegionRefData*)m_refData)->m_hPS = hPS;
+        }
+        delete [] pRect;
+    }
+} // end of wxRegion::SetPS
+
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //                             wxRegionIterator                              //