X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e9576ca53db96b462ed4c0b4bdf47d64c40203e4..92b002a4c8152c837ca42c1c190a7ccda4f866e9:/src/mac/region.cpp

diff --git a/src/mac/region.cpp b/src/mac/region.cpp
index c71d4c605a..315b966927 100644
--- a/src/mac/region.cpp
+++ b/src/mac/region.cpp
@@ -14,6 +14,7 @@
 
 #include "wx/region.h"
 #include "wx/gdicmn.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 	IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
@@ -28,19 +29,24 @@ class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
 public:
 	wxRegionRefData()
 	{
+		m_macRgn = NewRgn() ;
 	}
 
 	wxRegionRefData(const wxRegionRefData& data)
 	{
-        // TODO
+		m_macRgn = NewRgn() ;
+        CopyRgn( data.m_macRgn , m_macRgn ) ;
 	}
 
 	~wxRegionRefData()
 	{
-        // TODO
+        DisposeRgn( m_macRgn ) ;
 	}
+	RgnHandle	m_macRgn ;
 };
 
+#define M_REGION (((wxRegionRefData*)m_refData)->m_macRgn)
+#define OTHER_M_REGION(a) (((wxRegionRefData*)(a.m_refData))->m_macRgn)
 
 //-----------------------------------------------------------------------------
 // wxRegion
@@ -52,25 +58,30 @@ public:
 wxRegion::wxRegion()
 {
     m_refData = new wxRegionRefData;
-    // TODO create empty region
+}
+
+wxRegion::wxRegion(WXHRGN hRegion )
+{
+    m_refData = new wxRegionRefData;
+    CopyRgn( hRegion , M_REGION ) ;
 }
 
 wxRegion::wxRegion(long x, long y, long w, long h)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , x , y , x+w , y+h ) ;
 }
 
 wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , topLeft.x , topLeft.y , bottomRight.x , bottomRight.y ) ;
 }
 
 wxRegion::wxRegion(const wxRect& rect)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
 }
 
 /*!
@@ -95,41 +106,42 @@ void wxRegion::Clear()
 bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
 {
 	// Don't change shared data
-	if (!m_refData) {
+	if (!m_refData) 
+	{
 		m_refData = new wxRegionRefData();
-	} else if (m_refData->GetRefCount() > 1) {
+	} 
+	else if (m_refData->GetRefCount() > 1) 
+	{
 		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
 		UnRef();
 		m_refData = new wxRegionRefData(*ref);
 	}
-    // If ref count is 1, that means it's 'ours' anyway so no action.
-
-    // TODO create rect region
-
-    int mode = 0; // TODO platform-specific code
+    RgnHandle rgn = NewRgn() ;
+		SetRectRgn( rgn , x , y, x+width,y + height ) ;
+		
     switch (op)
     {
         case wxRGN_AND:
-            // TODO
+            SectRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_OR:
-            // TODO
+            UnionRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_XOR:
-            // TODO
+             XorRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_DIFF:
-            // TODO
+            DiffRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_COPY:
         default:
-            // TODO
+       			CopyRgn( rgn ,M_REGION ) ;
             break ;
     }
 
-    // TODO do combine region
+		DisposeRgn( rgn ) ;
 
-    return FALSE;
+    return TRUE;
 }
 
 //! Union /e region with this.
@@ -141,36 +153,35 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
 	// Don't change shared data
 	if (!m_refData) {
 		m_refData = new wxRegionRefData();
-	} else	if (m_refData->GetRefCount() > 1) {
+	} 
+	else	if (m_refData->GetRefCount() > 1) 
+	{
 		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
 		UnRef();
 		m_refData = new wxRegionRefData(*ref);
 	}
 
-    int mode = 0; // TODO platform-specific code
     switch (op)
     {
         case wxRGN_AND:
-            // TODO
+            SectRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_OR:
-            // TODO
+            UnionRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_XOR:
-            // TODO
+             XorRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_DIFF:
-            // TODO
+            DiffRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_COPY:
         default:
-            // TODO
+       			CopyRgn( OTHER_M_REGION(region) ,M_REGION ) ;
             break ;
     }
 
-    // TODO combine region
-
-	return FALSE;
+	return TRUE;
 }
 
 bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
@@ -183,18 +194,26 @@ bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
 //-----------------------------------------------------------------------------
 
 // Outer bounds of region
-void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
+void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const
 {
-	if (m_refData) {
-        // TODO get box
-	} else {
+	if (m_refData) 
+	{
+		Rect box ;
+		GetRegionBounds( M_REGION , &box ) ;
+        x = box.left ;
+        y = box.top ;
+        w = box.right - box.left ;
+        h = box.bottom - box.top ;
+	} 
+	else 
+	{
 		x = y = w = h = 0;
 	}
 }
 
 wxRect wxRegion::GetBox() const
 {
-    long x, y, w, h;
+    wxCoord x, y, w, h;
     GetBox(x, y, w, h);
     return wxRect(x, y, w, h);
 }
@@ -202,8 +221,12 @@ wxRect wxRegion::GetBox() const
 // Is region empty?
 bool wxRegion::Empty() const
 {
-    // TODO
-    return FALSE;
+    return EmptyRgn( M_REGION ) ;
+}
+
+const WXHRGN wxRegion::GetWXHRGN() const
+{
+	return M_REGION ;
 }
 
 //-----------------------------------------------------------------------------
@@ -228,11 +251,11 @@ wxRegionContain wxRegion::Contains(const wxPoint& pt) const
 	if (!m_refData)
 		return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (0)
+    Point p = { pt.y , pt.x } ;
+    if (PtInRgn( p , M_REGION ) )
         return wxInRegion;
-    else
-        return wxOutRegion;
+        
+    return wxOutRegion;
 }
 
 // Does the region contain the rectangle (x, y, w, h)?
@@ -241,8 +264,8 @@ wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
 	if (!m_refData)
 		return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (0)
+    Rect rect = { y , x , y + h , x + w } ;
+    if (RectInRgn( &rect , M_REGION ) )
         return wxInRegion;
     else
         return wxOutRegion;
@@ -308,8 +331,15 @@ void wxRegionIterator::Reset(const wxRegion& region)
 		m_numRects = 0;
 	else
     {
-        // TODO create m_rects and fill with rectangles for this region
-        m_numRects = 0;
+    	// we cannot dissolve it into rects on mac
+        m_rects = new wxRect[1];
+		Rect rect ;
+		GetRegionBounds( OTHER_M_REGION( region ) , &rect ) ;
+        m_rects[0].x = rect.left;
+        m_rects[0].y = rect.top;
+        m_rects[0].width = rect.right - rect.left;
+        m_rects[0].height = rect.bottom - rect.top;
+        m_numRects = 1;
     }
 }