#include "wx/region.h"
#include "wx/gdicmn.h"
+#include "wx/mac/uma.h"
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
public:
- wxRegionRefData()
- {
- m_macRgn = NewRgn() ;
- }
+ wxRegionRefData()
+ {
+ m_macRgn = NewRgn() ;
+ }
- wxRegionRefData(const wxRegionRefData& data)
- {
- m_macRgn = NewRgn() ;
+ wxRegionRefData(const wxRegionRefData& data)
+ : wxGDIRefData()
+ {
+ m_macRgn = NewRgn() ;
CopyRgn( data.m_macRgn , m_macRgn ) ;
- }
+ }
- ~wxRegionRefData()
- {
+ ~wxRegionRefData()
+ {
DisposeRgn( m_macRgn ) ;
- }
- RgnHandle m_macRgn ;
+ }
+ RgnHandle m_macRgn ;
};
#define M_REGION (((wxRegionRefData*)m_refData)->m_macRgn)
wxRegion::wxRegion(WXHRGN hRegion )
{
m_refData = new wxRegionRefData;
- CopyRgn( hRegion , M_REGION ) ;
+ CopyRgn( (RgnHandle) hRegion , (RgnHandle) M_REGION ) ;
}
wxRegion::wxRegion(long x, long y, long w, long h)
{
m_refData = new wxRegionRefData;
- SetRectRgn( M_REGION , x , y , x+w , y+h ) ;
+ SetRectRgn( (RgnHandle) M_REGION , x , y , x+w , y+h ) ;
}
wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
{
m_refData = new wxRegionRefData;
- SetRectRgn( M_REGION , topLeft.x , topLeft.y , bottomRight.x , bottomRight.y ) ;
+ SetRectRgn( (RgnHandle) M_REGION , topLeft.x , topLeft.y , bottomRight.x , bottomRight.y ) ;
}
wxRegion::wxRegion(const wxRect& rect)
{
m_refData = new wxRegionRefData;
- SetRectRgn( M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
+ SetRectRgn( (RgnHandle) M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
}
/*!
//-----------------------------------------------------------------------------
// 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)
{
- Rect box = (**M_REGION).rgnBBox ;
+ Rect box ;
+ GetRegionBounds( M_REGION , &box ) ;
x = box.left ;
y = box.top ;
w = box.right - box.left ;
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);
}
}
///////////////////////////////////////////////////////////////////////////////
-// //
-// wxRegionIterator //
-// //
+// //
+// wxRegionIterator //
+// //
///////////////////////////////////////////////////////////////////////////////
/*!
* Initialize empty iterator
*/
-wxRegionIterator::wxRegionIterator() : m_current(0), m_numRects(0), m_rects(NULL)
+wxRegionIterator::wxRegionIterator()
+ : m_current(0), m_numRects(0), m_rects(NULL)
{
}
wxRegionIterator::~wxRegionIterator()
{
- if (m_rects)
+ if (m_rects) {
delete[] m_rects;
+ m_rects = NULL;
+ }
+}
+
+wxRegionIterator::wxRegionIterator(const wxRegionIterator& iterator)
+ : wxObject()
+ , m_current(iterator.m_current)
+ , m_numRects(0)
+ , m_rects(NULL)
+{
+ SetRects(iterator.m_numRects, iterator.m_rects);
+}
+
+wxRegionIterator& wxRegionIterator::operator=(const wxRegionIterator& iterator)
+{
+ m_current = iterator.m_current;
+ SetRects(iterator.m_numRects, iterator.m_rects);
+ return *this;
+}
+
+/*!
+ * Set iterator rects for region
+ */
+void wxRegionIterator::SetRects(long numRects, wxRect *rects)
+{
+ if (m_rects) {
+ delete[] m_rects;
+ m_rects = NULL;
+ }
+ if (rects)
+ {
+ int i;
+ m_rects = new wxRect[numRects];
+ for (i = 0; i < numRects; i++)
+ m_rects[i] = rects[i];
+ }
+ m_numRects = numRects;
}
/*!
{
m_rects = NULL;
- Reset(region);
+ Reset(region);
}
/*!
*/
void wxRegionIterator::Reset(const wxRegion& region)
{
- m_current = 0;
- m_region = region;
+ m_current = 0;
+ m_region = region;
- if (m_rects)
+ if (m_rects) {
delete[] m_rects;
+ m_rects = NULL;
+ }
- m_rects = NULL;
-
- if (m_region.Empty())
- m_numRects = 0;
- else
+ if (m_region.Empty())
+ m_numRects = 0;
+ else
{
// we cannot dissolve it into rects on mac
m_rects = new wxRect[1];
- Rect rect = (**OTHER_M_REGION( region )).rgnBBox ;
+ 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;
* Increment iterator. The rectangle returned is the one after the
* incrementation.
*/
-void wxRegionIterator::operator ++ ()
+wxRegionIterator& wxRegionIterator::operator ++ ()
{
- if (m_current < m_numRects)
- ++m_current;
+ if (m_current < m_numRects)
+ ++m_current;
+ return *this;
}
/*!
* Increment iterator. The rectangle returned is the one before the
* incrementation.
*/
-void wxRegionIterator::operator ++ (int)
+wxRegionIterator wxRegionIterator::operator ++ (int)
{
- if (m_current < m_numRects)
- ++m_current;
+ wxRegionIterator previous(*this);
+
+ if (m_current < m_numRects)
+ ++m_current;
+
+ return previous;
}
long wxRegionIterator::GetX() const