]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/region.cpp
added SetDoubleBuffered() (patch 1491093)
[wxWidgets.git] / src / os2 / region.cpp
index 5404bf64db3871f91175111420abec12a01513b6..a0723c007389142b32bb6442d58e349fd0de5228 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// File:      region.cpp
+// File:      src/os2/region.cpp
 // Purpose:   Region class
 // Author:    David Webster
 // Modified by:
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#include "wx/app.h"
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/window.h"
+#endif
+
 #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
@@ -39,6 +42,7 @@ public:
         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
@@ -76,6 +80,7 @@ public:
 };
 
 #define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion)
+#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion)
 
 //-----------------------------------------------------------------------------
 // wxRegion
@@ -234,15 +239,12 @@ wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const
 //# Modify region
 //-----------------------------------------------------------------------------
 
-bool wxRegion::Offset(
-  wxCoord                           x
-, wxCoord                           y
-)
+bool wxRegion::Offset( wxCoord x, wxCoord y )
 {
     if ( !x && !y )
     {
         // nothing to do
-        return TRUE;
+        return true;
     }
 
     AllocExclusive();
@@ -252,10 +254,10 @@ bool wxRegion::Offset(
     {
         wxLogLastError(_T("OffsetRgn"));
 
-        return FALSE;
+        return false;
     }
 #endif
-    return TRUE;
+    return true;
 }
 
 //
@@ -277,104 +279,75 @@ bool wxRegion::Combine(
 , wxRegionOp                        eOp
 )
 {
-    AllocExclusive();
-
-    //
-    // If ref count is 1, that means it's 'ours' anyway so no action.
-    //
-    RECTL                           vRect;
-
-    vRect.xLeft   = x;
-    vRect.xRight  = x + vWidth;
-    vRect.yBottom = y;
-    vRect.yTop    = y + vHeight;
-
-    HRGN                            hRgn = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
-                                                             ,1
-                                                             ,&vRect
-                                                            );
-    LONG                            lMode = 0L;
-
-    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;
-    }
-    bool                            bSuccess = ::GpiCombineRegion( ((wxRegionRefData*)m_refData)->m_hPS
-                                                                  ,M_REGION
-                                                                  ,M_REGION
-                                                                  ,hRgn
-                                                                  ,lMode
-                                                                 );
-    ::GpiDestroyRegion ( ((wxRegionRefData*)m_refData)->m_hPS
-                        ,hRgn
-                       );
-
-    return bSuccess;
+    return Combine(wxRegion(x, y, vWidth, vHeight), eOp);
 } // end of wxRegion::Combine
 
 //
 // Union region with this.
 //
-bool wxRegion::Combine(
-  const wxRegion&                   rRegion
-, wxRegionOp                        eOp
-)
+bool wxRegion::Combine( const wxRegion& rRegion, wxRegionOp eOp )
 {
-    if (rRegion.Empty())
-        return FALSE;
-
-    AllocExclusive();
+    //
+    // We can't use the API functions if we don't have a valid region handle
+    //
+    if (!m_refData)
+    {
+        // 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
+    {
 
-    LONG                            lMode = 0;
+        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;
+        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 (::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
 
 bool wxRegion::Combine(
@@ -436,13 +409,13 @@ wxRect wxRegion::GetBox() const
 //
 bool wxRegion::Empty() const
 {
-    wxCoord                         x;
-    wxCoord                         y;
-    wxCoord                         vWidth;
-    wxCoord                         vHeight;
+    wxCoord x;
+    wxCoord y;
+    wxCoord vWidth;
+    wxCoord vHeight;
 
     if (M_REGION == 0)
-        return TRUE;
+        return true;
 
     GetBox( x
            ,y
@@ -463,7 +436,6 @@ wxRegionContain wxRegion::Contains(
 , wxCoord                           y
 ) const
 {
-    bool                            bOK = FALSE;
     POINTL                          vPoint;
 
     vPoint.x = x;
@@ -579,6 +551,7 @@ void wxRegion::SetPS(
     RGNRECT                     vRgnData;
     PRECTL                      pRect = NULL;
 
+    vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
     if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS
                               ,((wxRegionRefData*)m_refData)->m_hRegion
                               ,NULL
@@ -654,6 +627,7 @@ void wxRegionIterator::Reset(
 )
 {
     m_lCurrent = 0;
+    m_lNumRects = 0;
     m_vRegion  = rRegion;
 
     if (m_pRects)
@@ -668,6 +642,7 @@ void wxRegionIterator::Reset(
         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
@@ -687,10 +662,12 @@ void wxRegionIterator::Reset(
                                       ,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;
@@ -698,7 +675,9 @@ void wxRegionIterator::Reset(
                     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
             }
         }
     }
@@ -751,4 +730,3 @@ wxCoord wxRegionIterator::GetH() const
         return m_pRects[m_lCurrent].height;
     return 0L;
 } // end of wxRegionIterator::GetH
-