]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/region.cpp
call Init() from wxBufferedDC ctors to ensure that layout direction is inherited...
[wxWidgets.git] / src / os2 / region.cpp
index 58495d9a9e2b182d71009fcc2819a76e1f6449fa..f2fe44a6077f0c99af27031d6ed8cfdf93f2ab74 100644 (file)
@@ -1,27 +1,29 @@
 /////////////////////////////////////////////////////////////////////////////
-// File:      region.cpp
+// File:      src/os2/region.cpp
 // Purpose:   Region class
 // Author:    David Webster
 // Modified by:
 // Created:   10/15/99
-// RCS-ID:       $Id$
-// Copyright: (c) Davdi Webster
+// RCS-ID:    $Id$
+// Copyright: (c) David Webster
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/window.h"
+    #include "wx/gdicmn.h"
+#endif
+
 #include "wx/os2/region.h"
-#include "wx/gdicmn.h"
 
-#include "wx/window.h"
 #include "wx/os2/private.h"
 
-#if !USE_SHARED_LIBRARY
-       IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
-       IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
-#endif
+IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
 
 //-----------------------------------------------------------------------------
 // wxRegionRefData implementation
@@ -31,255 +33,432 @@ class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
 public:
     wxRegionRefData()
     {
-        m_region = 0;
+        m_hRegion = 0;
+        m_hPS     = 0;
     }
 
-    wxRegionRefData(const wxRegionRefData& data)
+    wxRegionRefData(const wxRegionRefData& rData)
     {
-        // TODO
+        RGNRECT                     vRgnData;
+        PRECTL                      pRect = NULL;
+
+        vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
+        if (::GpiQueryRegionRects( rData.m_hPS      // Pres space
+                                  ,rData.m_hRegion  // Handle of region to query
+                                  ,NULL             // Return all RECTs
+                                  ,&vRgnData        // Will contain number or RECTs in region
+                                  ,NULL             // NULL to return number of RECTs
+                                 ))
+        {
+            pRect = new RECTL[vRgnData.crcReturned];
+            vRgnData.crc = vRgnData.crcReturned;
+            vRgnData.ircStart = 1;
+            if (::GpiQueryRegionRects( rData.m_hPS     // Pres space of source
+                                      ,rData.m_hRegion // Handle of source region
+                                      ,NULL            // Return all RECTs
+                                      ,&vRgnData       // Operations set to return rects
+                                      ,pRect           // Will contain the actual RECTS
+                                     ))
+            {
+                m_hRegion = ::GpiCreateRegion( rData.m_hPS
+                                              ,vRgnData.crcReturned
+                                              ,pRect
+                                             );
+                m_hPS = rData.m_hPS;
+            }
+            delete [] pRect;
+        }
     }
 
-    ~wxRegionRefData()
+    virtual ~wxRegionRefData()
     {
-        // TODO
-
+        ::GpiDestroyRegion(m_hPS, m_hRegion);
     }
 
-    HRGN m_region;
+    HRGN                            m_hRegion;
+    HPS                             m_hPS;
 };
 
-#define M_REGION (((wxRegionRefData*)m_refData)->m_region)
+#define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion)
+#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion)
 
 //-----------------------------------------------------------------------------
 // wxRegion
 //-----------------------------------------------------------------------------
 
+// General remark:
+// wxRegion is always basically stored in wx coordinates. However, since
+// OS/2's internal functions rely on "top > bottom", the values of top and
+// bottom values of a region need to be interchanged, as compared to wx.
+// This needs to be taken into account when feeding any rectangle to wx _or_
+// when accessing the region data via GetBox, wxRegionIterator or otherwise.
+
 /*!
  * Create an empty region.
  */
 wxRegion::wxRegion()
 {
     m_refData = new wxRegionRefData;
-    // TODO create empty region
-}
+} // end of wxRegion::wxRegion
 
-wxRegion::wxRegion(WXHRGN hRegion)
+wxRegion::wxRegion(
+  WXHRGN                            hRegion,
+  WXHDC                             hPS
+)
 {
     m_refData = new wxRegionRefData;
     M_REGION = (HRGN) hRegion;
-}
-
-wxRegion::wxRegion(long x, long y, long w, long h)
+    (((wxRegionRefData*)m_refData)->m_hPS) = hPS;
+} // end of wxRegion::wxRegion
+
+wxRegion::wxRegion(
+  wxCoord                           x
+, wxCoord                           y
+, wxCoord                           vWidth
+, wxCoord                           vHeight
+)
 {
-    m_refData = new wxRegionRefData;
-    // TODO create rect region
-}
-
-wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
+    RECTL                           vRect;
+    SIZEL                           vSize = {0, 0};
+    DEVOPENSTRUC                    vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    HDC                             hDC = ::DevOpenDC( vHabmain
+                                                      ,OD_MEMORY
+                                                      ,"*"
+                                                      ,5L
+                                                      ,(PDEVOPENDATA)&vDop
+                                                      ,NULLHANDLE
+                                                     );
+
+
+    vRect.xLeft   = x;
+    vRect.xRight  = x + vWidth;
+    vRect.yBottom = y;
+    vRect.yTop    = y + vHeight;
+
+    m_refData     = new wxRegionRefData;
+
+    //
+    // Need a PS to create a Region
+    //
+    ((wxRegionRefData*)m_refData)->m_hPS = ::GpiCreatePS( vHabmain
+                                                         ,hDC
+                                                         ,&vSize
+                                                         ,PU_PELS | GPIT_MICRO | GPIA_ASSOC
+                                                        );
+    M_REGION      = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
+                                      ,1
+                                      ,&vRect
+                                     );
+} // end of wxRegion::wxRegion
+
+wxRegion::wxRegion(
+  const wxPoint&                    rTopLeft
+, const wxPoint&                    rBottomRight
+)
 {
-    m_refData = new wxRegionRefData;
-    // TODO create rect region
-}
+    RECTL                           vRect;
+    SIZEL                           vSize = {0, 0};
+    DEVOPENSTRUC                    vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    HDC                             hDC = ::DevOpenDC( vHabmain
+                                                      ,OD_MEMORY
+                                                      ,"*"
+                                                      ,5L
+                                                      ,(PDEVOPENDATA)&vDop
+                                                      ,NULLHANDLE
+                                                     );
+
+    vRect.xLeft   = rTopLeft.x;
+    vRect.xRight  = rBottomRight.x;
+    vRect.yBottom = rTopLeft.y;
+    vRect.yTop    = rBottomRight.y;
+
+    m_refData     = new wxRegionRefData;
+
+    //
+    // Need a PS to create a Region
+    //
+    ((wxRegionRefData*)m_refData)->m_hPS = ::GpiCreatePS( vHabmain
+                                                         ,hDC
+                                                         ,&vSize
+                                                         ,PU_PELS | GPIT_MICRO | GPIA_ASSOC
+                                                        );
+    M_REGION      = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
+                                      ,1
+                                      ,&vRect
+                                     );
+} // end of wxRegion::wxRegion
+
+wxRegion::wxRegion(
+  const wxRect&                     rRect
+)
+{
+    RECTL                           vRect;
+    SIZEL                           vSize = {0, 0};
+    DEVOPENSTRUC                    vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    HDC                             hDC = ::DevOpenDC( vHabmain
+                                                      ,OD_MEMORY
+                                                      ,"*"
+                                                      ,5L
+                                                      ,(PDEVOPENDATA)&vDop
+                                                      ,NULLHANDLE
+                                                     );
+
+
+    vRect.xLeft   = rRect.x;
+    vRect.xRight  = rRect.x + rRect.width;
+    vRect.yBottom = rRect.y;
+    vRect.yTop    = rRect.y + rRect.height;
+
+    m_refData     = new wxRegionRefData;
+
+    //
+    // Need a PS to create a Region
+    //
+    ((wxRegionRefData*)m_refData)->m_hPS = ::GpiCreatePS( vHabmain
+                                                         ,hDC
+                                                         ,&vSize
+                                                         ,PU_PELS | GPIT_MICRO | GPIA_ASSOC
+                                                        );
+    M_REGION      = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
+                                      ,1
+                                      ,&vRect
+                                     );
+} // end of wxRegion::wxRegion
+
+//
+// Destroy the region.
+//
+wxRegion::~wxRegion()
+{
+} // end of wxRegion::~wxRegion
 
-wxRegion::wxRegion(const wxRect& rect)
+wxObjectRefData *wxRegion::CreateData() const
 {
-    m_refData = new wxRegionRefData;
-    // TODO create rect region
+    return new wxRegionRefData;
 }
 
-/*!
- * Destroy the region.
- */
-wxRegion::~wxRegion()
+wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const
 {
-    // m_refData unrefed in ~wxObject
+    return new wxRegionRefData(*(wxRegionRefData *)data);
 }
 
 //-----------------------------------------------------------------------------
 //# Modify region
 //-----------------------------------------------------------------------------
 
-//! Clear current region
-void wxRegion::Clear()
-{
-    UnRef();
-}
-
-//! Combine rectangle (x, y, w, h) with this.
-bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
+bool wxRegion::DoOffset( wxCoord x, wxCoord y )
 {
-    // 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 ( !x && !y )
+    {
+        // nothing to do
+        return true;
     }
-    // If ref count is 1, that means it's 'ours' anyway so no action.
 
-    // TODO create rect region
+    AllocExclusive();
 
-    int mode = 0; // TODO platform-specific code
-    switch (op)
+#if 0
+    if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
     {
-        case wxRGN_AND:
-            // TODO
-            break ;
-        case wxRGN_OR:
-            // TODO
-            break ;
-        case wxRGN_XOR:
-            // TODO
-            break ;
-        case wxRGN_DIFF:
-            // TODO
-            break ;
-        case wxRGN_COPY:
-        default:
-            // TODO
-            break ;
-    }
-
-    // TODO do combine region
+        wxLogLastError(_T("OffsetRgn"));
 
-    return FALSE;
+        return false;
+    }
+#endif
+    return true;
 }
 
-//! Union /e region with this.
-bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
+//
+// Clear current region
+//
+void wxRegion::Clear()
 {
-    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);
-    }
+    UnRef();
+} // end of wxRegion::Clear
 
-    int mode = 0; // TODO platform-specific code
-    switch (op)
+//
+// Union region with this.
+//
+bool wxRegion::DoCombine( const wxRegion& rRegion, wxRegionOp eOp )
+{
+    //
+    // We can't use the API functions if we don't have a valid region handle
+    //
+    if (!m_refData)
     {
-        case wxRGN_AND:
-            // TODO
-            break ;
-        case wxRGN_OR:
-            // TODO
-            break ;
-        case wxRGN_XOR:
-            // TODO
-            break ;
-        case wxRGN_DIFF:
-            // TODO
-            break ;
-        case wxRGN_COPY:
-        default:
-            // TODO
-            break ;
+        // combining with an empty/invalid region works differently depending
+        // on the operation
+        switch (eOp)
+        {
+            case wxRGN_COPY:
+            case wxRGN_OR:
+            case wxRGN_XOR:
+                *this = rRegion;
+                break;
+
+            default:
+                wxFAIL_MSG( _T("unknown region operation") );
+                // fall through
+
+            case wxRGN_AND:
+            case wxRGN_DIFF:
+                // leave empty/invalid
+                return false;
+        }
     }
+    else // we have a valid region
+    {
 
-    // TODO combine region
-
-    return FALSE;
-}
-
-bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
-{
-    return Combine(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight(), op);
-}
+        LONG                        lMode = 0;
+
+        switch (eOp)
+        {
+            case wxRGN_AND:
+                lMode = CRGN_AND;
+                break;
+
+            case wxRGN_OR:
+                lMode = CRGN_OR;
+                break;
+
+            case wxRGN_XOR:
+                lMode = CRGN_XOR;
+                break;
+
+            case wxRGN_DIFF:
+                lMode = CRGN_DIFF;
+                break;
+
+            case wxRGN_COPY:
+            default:
+                lMode = CRGN_COPY;
+                break;
+        }
+        return (::GpiCombineRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS
+                                   ,M_REGION
+                                   ,M_REGION
+                                   ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion
+                                   ,lMode
+                                  ) != RGN_ERROR);
+    }
+    return true;
+} // end of wxRegion::Combine
 
 //-----------------------------------------------------------------------------
 //# Information on region
 //-----------------------------------------------------------------------------
 
-// Outer bounds of region
-void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
+bool wxRegion::DoIsEqual(const wxRegion& WXUNUSED(region)) const
 {
-    if (m_refData) {
-        // TODO get box
-    } else {
-        x = y = w = h = 0;
-    }
+    return false;
 }
 
-wxRect wxRegion::GetBox() const
+//
+// Outer bounds of region
+//
+bool wxRegion::DoGetBox(
+  wxCoord&                          x
+, wxCoord&                          y
+, wxCoord&                          vWidth
+, wxCoord&                          vHeight
+) const
 {
-    long x, y, w, h;
-    GetBox(x, y, w, h);
-    return wxRect(x, y, w, h);
-}
+    if (m_refData)
+    {
+        RECTL                       vRect;
+        APIRET                      rc;
+
+        rc = ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
+                            ,M_REGION
+                            ,&vRect
+                           );
+        x       = vRect.xLeft;
+        y       = vRect.yBottom;
+        vWidth  = vRect.xRight - vRect.xLeft;
+        vHeight = vRect.yTop - vRect.yBottom;
+        return true;
+    }
+    else
+    {
+        x = y = vWidth = vHeight = 0L;
+        return false;
+    }
+} // end of wxRegion::GetBox
 
+//
 // Is region empty?
-bool wxRegion::Empty() const
+//
+bool wxRegion::IsEmpty() const
 {
-    // TODO
-    return FALSE;
-}
+    wxCoord x;
+    wxCoord y;
+    wxCoord vWidth;
+    wxCoord vHeight;
+
+    if (M_REGION == 0)
+        return true;
+
+    GetBox( x
+           ,y
+           ,vWidth
+           ,vHeight
+          );
+    return ((vWidth == 0) && (vHeight == 0));
+} // end of wxRegion::IsEmpty
 
 //-----------------------------------------------------------------------------
-//# Tests
+// Tests
 //-----------------------------------------------------------------------------
-
-// Does the region contain the point (x,y)?
-wxRegionContain wxRegion::Contains(long x, long y) const
-{
-    bool    bOK = FALSE; // temporary
-    if (!m_refData)
-        return wxOutRegion;
-
-    // TODO. Return wxInRegion if within region.
-    if (bOK)
-        return wxInRegion;
-    return wxOutRegion;
-}
-
+//
 // Does the region contain the point pt?
-wxRegionContain wxRegion::Contains(const wxPoint& pt) const
+//
+wxRegionContain wxRegion::DoContainsPoint( wxCoord x, wxCoord y ) const
 {
-    bool    bOK = FALSE; // temporary
+    POINTL vPoint = { x, y };
+
     if (!m_refData)
         return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (bOK)
+    LONG lInside = ::GpiPtInRegion( ((wxRegionRefData*)m_refData)->m_hPS,
+                                    M_REGION,
+                                    &vPoint
+                                  );
+    if (lInside == PRGN_INSIDE)
         return wxInRegion;
     else
         return wxOutRegion;
-}
+} // end of wxRegion::Contains
 
+//
 // Does the region contain the rectangle (x, y, w, h)?
-wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
+//
+wxRegionContain wxRegion::DoContainsRect(const wxRect& rect) const
 {
-    bool    bOK = FALSE; // temporary
     if (!m_refData)
         return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (bOK)
-        return wxInRegion;
-    else
-        return wxOutRegion;
-}
-
-// Does the region contain the rectangle rect
-wxRegionContain wxRegion::Contains(const wxRect& rect) const
-{
-    if (!m_refData)
-        return wxOutRegion;
+    RECTL   vRect;
+    vRect.xLeft   = rect.x;
+    vRect.xRight  = rect.x + rect.width;
+    vRect.yTop    = rect.y + rect.height;
+    vRect.yBottom = rect.y;
+
+    LONG lInside = ::GpiRectInRegion( ((wxRegionRefData*)m_refData)->m_hPS,
+                                      M_REGION,
+                                      &vRect
+                                    );
+    switch (lInside)
+    {
+        case RRGN_INSIDE    :   return wxInRegion;
+        case RRGN_PARTIAL   :   return wxPartRegion;
+        case RRGN_ERROR     :
+        default             :   return wxOutRegion;
+    }
 
-    long x, y, w, h;
-    x = rect.x;
-    y = rect.y;
-    w = rect.GetWidth();
-    h = rect.GetHeight();
-    return Contains(x, y, w, h);
-}
+} // end of wxRegion::Contains
 
+//
 // Get internal region handle
+//
 WXHRGN wxRegion::GetHRGN() const
 {
     if (!m_refData)
@@ -287,102 +466,193 @@ 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;
+
+    vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
+    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                              //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
-/*!
- * Initialize empty iterator
- */
-wxRegionIterator::wxRegionIterator() : m_current(0), m_numRects(0), m_rects(NULL)
+//
+// Initialize empty iterator
+//
+wxRegionIterator::wxRegionIterator()
+: m_lCurrent(0)
+, m_lNumRects(0)
+, m_pRects(NULL)
 {
-}
+} // end of wxRegionIterator::wxRegionIterator
 
 wxRegionIterator::~wxRegionIterator()
 {
-    if (m_rects)
-        delete[] m_rects;
-}
-
-/*!
- * Initialize iterator for region
- */
-wxRegionIterator::wxRegionIterator(const wxRegion& region)
+    if (m_pRects)
+        delete[] m_pRects;
+} // end of wxRegionIterator::~wxRegionIterator
+
+//
+// Initialize iterator for region
+//
+wxRegionIterator::wxRegionIterator(
+  const wxRegion&                   rRegion
+)
 {
-    m_rects = NULL;
-
-    Reset(region);
-}
-
-/*!
- * Reset iterator for a new /e region.
- */
-void wxRegionIterator::Reset(const wxRegion& region)
+    m_pRects = NULL;
+    Reset(rRegion);
+} // end of wxRegionIterator::wxRegionIterator
+
+//
+// Reset iterator for a new /e region.
+//
+void wxRegionIterator::Reset(
+  const wxRegion&                   rRegion
+)
 {
-    m_current = 0;
-    m_region = region;
+    m_lCurrent = 0;
+    m_lNumRects = 0;
+    m_vRegion  = rRegion;
 
-    if (m_rects)
-        delete[] m_rects;
+    if (m_pRects)
+        delete[] m_pRects;
 
-    m_rects = NULL;
+    m_pRects = NULL;
 
-    if (m_region.Empty())
-        m_numRects = 0;
+    if (m_vRegion.Empty())
+        m_lNumRects = 0;
     else
     {
-        // TODO create m_rects and fill with rectangles for this region
-        m_numRects = 0;
+        RGNRECT                     vRgnData;
+        PRECTL                      pRect;
+
+        vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
+        if (::GpiQueryRegionRects( ((wxRegionRefData*)rRegion.m_refData)->m_hPS     // Pres space
+                                  ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion // Handle of region to query
+                                  ,NULL                                             // Return all RECTs
+                                  ,&vRgnData                                        // Will contain number or RECTs in region
+                                  ,NULL                                             // NULL to return number of RECTs
+                                 ))
+        {
+            pRect = new RECTL[vRgnData.crcReturned];
+            m_pRects = new wxRect[vRgnData.crcReturned];
+            vRgnData.crc = vRgnData.crcReturned;
+            m_lNumRects = vRgnData.crcReturned;
+            vRgnData.ircStart = 1;
+            if (::GpiQueryRegionRects( ((wxRegionRefData*)rRegion.m_refData)->m_hPS     // Pres space of source
+                                      ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion // Handle of source region
+                                      ,NULL                                             // Return all RECTs
+                                      ,&vRgnData                                        // Operations set to return rects
+                                      ,pRect                                            // Will contain the actual RECTS
+                                     ))
+            {
+#if 0
+                M_REGION = ::GpiCreateRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS
+                                             ,vRgnData.crcReturned
+                                             ,pRect
+                                            );
+#endif
+                for( LONG i = 0; i < m_lNumRects; i++)
+                {
+                    m_pRects[i].x      = pRect[i].xLeft;
+                    m_pRects[i].width  = pRect[i].xRight - pRect[i].xLeft;
+                    m_pRects[i].y      = pRect[i].yBottom;
+                    m_pRects[i].height = pRect[i].yTop - pRect[i].yBottom;
+                }
+#if 0
+                ((wxRegionRefData*)m_refData)->m_hPS = ((wxRegionRefData*)rRegion.m_refData)->m_hPS;
+#endif
+            }
+        }
     }
-}
+} // end of wxRegionIterator::Reset
 
-/*!
- * Increment iterator. The rectangle returned is the one after the
- * incrementation.
- */
-void wxRegionIterator::operator ++ ()
+//
+// Increment iterator. The rectangle returned is the one after the
+// incrementation.
+//
+void wxRegionIterator::operator++ ()
 {
-    if (m_current < m_numRects)
-        ++m_current;
-}
-
-/*!
- * Increment iterator. The rectangle returned is the one before the
- * incrementation.
- */
-void wxRegionIterator::operator ++ (int)
+    if (m_lCurrent < m_lNumRects)
+        ++m_lCurrent;
+} // end of wxRegionIterator::operator ++
+
+//
+// Increment iterator. The rectangle returned is the one before the
+// incrementation.
+//
+void wxRegionIterator::operator++ (int)
 {
-    if (m_current < m_numRects)
-        ++m_current;
-}
+    if (m_lCurrent < m_lNumRects)
+        ++m_lCurrent;
+} // end of wxRegionIterator::operator++
 
-long wxRegionIterator::GetX() const
+wxCoord wxRegionIterator::GetX() const
 {
-    if (m_current < m_numRects)
-        return m_rects[m_current].x;
-    return 0;
-}
+    if (m_lCurrent < m_lNumRects)
+        return m_pRects[m_lCurrent].x;
+    return 0L;
+} // end of wxRegionIterator::GetX
 
-long wxRegionIterator::GetY() const
+wxCoord wxRegionIterator::GetY() const
 {
-    if (m_current < m_numRects)
-        return m_rects[m_current].y;
-    return 0;
-}
+    if (m_lCurrent < m_lNumRects)
+        return m_pRects[m_lCurrent].y;
+    return 0L;
+} // end of wxRegionIterator::GetY
 
-long wxRegionIterator::GetW() const
+wxCoord wxRegionIterator::GetW() const
 {
-    if (m_current < m_numRects)
-        return m_rects[m_current].width ;
-    return 0;
-}
+    if (m_lCurrent < m_lNumRects)
+        return m_pRects[m_lCurrent].width ;
+    return 0L;
+} // end of wxRegionIterator::GetW
 
-long wxRegionIterator::GetH() const
+wxCoord wxRegionIterator::GetH() const
 {
-    if (m_current < m_numRects)
-        return m_rects[m_current].height;
-    return 0;
-}
-
+    if (m_lCurrent < m_lNumRects)
+        return m_pRects[m_lCurrent].height;
+    return 0L;
+} // end of wxRegionIterator::GetH