]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/region.cpp
fix for non-quartz branch
[wxWidgets.git] / src / mac / carbon / region.cpp
index a3cf8cef7b84f3eb0ed2287cf5517d9f3694fb08..ab424534701419b84e8bea10166cd3d4c3e62a7e 100644 (file)
@@ -8,10 +8,12 @@
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "region.h"
 #endif
 
+#include "wx/wxprec.h"
+
 #include "wx/region.h"
 #include "wx/gdicmn.h"
 #include "wx/mac/uma.h"
@@ -85,6 +87,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,6 +130,22 @@ 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)
 {
@@ -356,6 +399,40 @@ wxRegionIterator::wxRegionIterator(const wxRegion& region)
 /*!
  * Reset iterator for a new /e region.
  */
+OSStatus wxMacRegionToRectsCounterCallback (
+    UInt16 message, RgnHandle region, const Rect *rect, void *data)
+{
+    long *m_numRects = (long*) data ;
+    if ( message == kQDRegionToRectsMsgInit )
+    {
+        (*m_numRects) = 0 ;
+    }
+    else if (message == kQDRegionToRectsMsgParse)
+    {
+        (*m_numRects) += 1 ;
+    }
+    return noErr;
+}
+class RegionToRectsCallbackData 
+{
+public :
+    wxRect* m_rects ;
+    long m_current ;
+} ;
+
+OSStatus wxMacRegionToRectsSetterCallback (
+    UInt16 message, RgnHandle region, const Rect *rect, void *data)
+{
+    if (message == kQDRegionToRectsMsgParse)
+    {
+        RegionToRectsCallbackData *cb = (RegionToRectsCallbackData*) data ;
+        cb->m_rects[cb->m_current] = wxRect( rect->left , rect->top , rect->right - rect->left , rect->bottom - rect->top ) ;
+    }
+    return noErr;
+}
+
 void wxRegionIterator::Reset(const wxRegion& region)
 {
     m_current = 0;
@@ -370,15 +447,25 @@ void wxRegionIterator::Reset(const wxRegion& region)
         m_numRects = 0;
     else
     {
-        // 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;
+        RegionToRectsUPP proc = NewRegionToRectsUPP (wxMacRegionToRectsCounterCallback);
+
+        OSStatus err = noErr;
+        err = QDRegionToRects (OTHER_M_REGION( region ) , kQDParseRegionFromTopLeft, proc, (void*)&m_numRects); 
+        if (err == noErr) 
+        {
+            DisposeRegionToRectsUPP (proc);
+            proc = NewRegionToRectsUPP (wxMacRegionToRectsSetterCallback);
+            m_rects = new wxRect[m_numRects];
+            RegionToRectsCallbackData data ;
+            data.m_rects = m_rects ;
+            data.m_current = 0 ;
+            QDRegionToRects (OTHER_M_REGION( region ) , kQDParseRegionFromTopLeft, proc, (void*)&data); 
+        }
+        else 
+        {
+            m_numRects = 0 ;
+        }
+        DisposeRegionToRectsUPP (proc);
     }
 }