]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/region.cpp
Fix centering of top-level children of wxMDIParentFrame on Mac
[wxWidgets.git] / src / mac / carbon / region.cpp
index 6c1ef13da2dc1b969ca3470b7a9cef84c670fb1b..aefaa806930ece47ecf515dfdb3dd78a2e661898 100644 (file)
@@ -1,10 +1,10 @@
 /////////////////////////////////////////////////////////////////////////////
 // File:      region.cpp
 // Purpose:   Region class
-// Author:    Markus Holzem/Julian Smart/Stefan Csomor
+// Author:    Stefan Csomor
 // Created:   Fri Oct 24 10:46:34 MET 1997
-// RCS-ID:       $Id$
-// Copyright: (c) 1997 Markus Holzem/Julian Smart/Stefan Csomor
+// RCS-ID:    $Id$
+// Copyright: (c) 1997 Stefan Csomor
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -17,8 +17,8 @@
 #include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
-       IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
-       IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
 #endif
 
 //-----------------------------------------------------------------------------
@@ -43,7 +43,7 @@ public:
     {
         DisposeRgn( m_macRgn ) ;
     }
-    RgnHandle  m_macRgn ;
+    RgnHandle    m_macRgn ;
 };
 
 #define M_REGION (((wxRegionRefData*)m_refData)->m_macRgn)
@@ -85,6 +85,31 @@ wxRegion::wxRegion(const wxRect& rect)
     SetRectRgn( (RgnHandle) M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
 }
 
+wxRegion::wxRegion(size_t n, const wxPoint *points, int WXUNUSED(fillStyle))
+{
+    m_refData = new wxRegionRefData;
+
+    OpenRgn();
+
+    wxCoord x1, x2 , y1 , y2 ;
+    x2 = x1 = points[0].x ;
+    y2 = y1 = points[0].y ;
+    ::MoveTo(x1,y1);
+    for (size_t i = 1; i < n; i++)
+    {
+        x2 = points[i].x ;
+        y2 = points[i].y ;
+        ::LineTo(x2, y2);
+    }
+    // close the polyline if necessary
+    if ( x1 != x2 || y1 != y2 )
+    {
+        ::LineTo(x1,y1 ) ;
+    }
+    ClosePoly();
+    CloseRgn( M_REGION ) ;
+}
+
 /*!
  * Destroy the region.
  */
@@ -103,23 +128,39 @@ void wxRegion::Clear()
     UnRef();
 }
 
+// Move the region
+bool wxRegion::Offset(wxCoord x, wxCoord y)
+{
+    wxCHECK_MSG( M_REGION, false, _T("invalid wxRegion") );
+
+    if ( !x && !y )
+    {
+        // nothing to do
+        return true;
+    }
+
+    OffsetRgn( M_REGION , x , y ) ;
+    return true ;
+}
+
+
 //! Combine rectangle (x, y, w, h) with this.
 bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
 {
-       // 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);
-       }
+    // 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);
+    }
     RgnHandle rgn = NewRgn() ;
-               SetRectRgn( rgn , x , y, x+width,y + height ) ;
-               
+        SetRectRgn( rgn , x , y, x+width,y + height ) ;
+        
     switch (op)
     {
         case wxRGN_AND:
@@ -136,11 +177,11 @@ bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
             break ;
         case wxRGN_COPY:
         default:
-                               CopyRgn( rgn ,M_REGION ) ;
+                   CopyRgn( rgn ,M_REGION ) ;
             break ;
     }
 
-               DisposeRgn( rgn ) ;
+        DisposeRgn( rgn ) ;
 
     return TRUE;
 }
@@ -148,19 +189,19 @@ bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
 //! Union /e region with this.
 bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
 {
-       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);
-       }
+    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);
+    }
 
     switch (op)
     {
@@ -178,11 +219,11 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
             break ;
         case wxRGN_COPY:
         default:
-                               CopyRgn( OTHER_M_REGION(region) ,M_REGION ) ;
+                   CopyRgn( OTHER_M_REGION(region) ,M_REGION ) ;
             break ;
     }
 
-       return TRUE;
+    return TRUE;
 }
 
 bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
@@ -197,19 +238,19 @@ bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
 // Outer bounds of region
 void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const
 {
-       if (m_refData) 
-       {
-               Rect box ;
-               GetRegionBounds( M_REGION , &box ) ;
+    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;
-       }
+    } 
+    else 
+    {
+        x = y = w = h = 0;
+    }
 }
 
 wxRect wxRegion::GetBox() const
@@ -227,7 +268,7 @@ bool wxRegion::Empty() const
 
 const WXHRGN wxRegion::GetWXHRGN() const
 {
-       return M_REGION ;
+    return M_REGION ;
 }
 
 //-----------------------------------------------------------------------------
@@ -237,8 +278,8 @@ const WXHRGN wxRegion::GetWXHRGN() const
 // Does the region contain the point (x,y)?
 wxRegionContain wxRegion::Contains(long x, long y) const
 {
-       if (!m_refData)
-               return wxOutRegion;
+    if (!m_refData)
+        return wxOutRegion;
 
     // TODO. Return wxInRegion if within region.
     if (0)
@@ -249,8 +290,8 @@ wxRegionContain wxRegion::Contains(long x, long y) const
 // Does the region contain the point pt?
 wxRegionContain wxRegion::Contains(const wxPoint& pt) const
 {
-       if (!m_refData)
-               return wxOutRegion;
+    if (!m_refData)
+        return wxOutRegion;
 
     Point p = { pt.y , pt.x } ;
     if (PtInRgn( p , M_REGION ) )
@@ -262,8 +303,8 @@ wxRegionContain wxRegion::Contains(const wxPoint& pt) const
 // Does the region contain the rectangle (x, y, w, h)?
 wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
 {
-       if (!m_refData)
-               return wxOutRegion;
+    if (!m_refData)
+        return wxOutRegion;
 
     Rect rect = { y , x , y + h , x + w } ;
     if (RectInRgn( &rect , M_REGION ) )
@@ -275,8 +316,8 @@ wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
 // Does the region contain the rectangle rect
 wxRegionContain wxRegion::Contains(const wxRect& rect) const
 {
-       if (!m_refData)
-               return wxOutRegion;
+    if (!m_refData)
+        return wxOutRegion;
 
     long x, y, w, h;
     x = rect.x;
@@ -370,7 +411,7 @@ void wxRegionIterator::Reset(const wxRegion& region)
         m_numRects = 0;
     else
     {
-       // we cannot dissolve it into rects on mac
+        // we cannot dissolve it into rects on mac
         m_rects = new wxRect[1];
         Rect rect ;
         GetRegionBounds( OTHER_M_REGION( region ) , &rect ) ;
@@ -409,29 +450,29 @@ wxRegionIterator wxRegionIterator::operator ++ (int)
 
 long wxRegionIterator::GetX() const
 {
-       if (m_current < m_numRects)
-               return m_rects[m_current].x;
-       return 0;
+    if (m_current < m_numRects)
+        return m_rects[m_current].x;
+    return 0;
 }
 
 long wxRegionIterator::GetY() const
 {
-       if (m_current < m_numRects)
-               return m_rects[m_current].y;
-       return 0;
+    if (m_current < m_numRects)
+        return m_rects[m_current].y;
+    return 0;
 }
 
 long wxRegionIterator::GetW() const
 {
-       if (m_current < m_numRects)
-               return m_rects[m_current].width ;
-       return 0;
+    if (m_current < m_numRects)
+        return m_rects[m_current].width ;
+    return 0;
 }
 
 long wxRegionIterator::GetH() const
 {
-       if (m_current < m_numRects)
-               return m_rects[m_current].height;
-       return 0;
+    if (m_current < m_numRects)
+        return m_rects[m_current].height;
+    return 0;
 }