/////////////////////////////////////////////////////////////////////////////
-// File: src/mac/carbon/region.cpp
+// File: src/osx/carbon/region.cpp
// Purpose: Region class
// Author: Stefan Csomor
// Created: Fri Oct 24 10:46:34 MET 1997
#include "wx/wxprec.h"
+#if wxOSX_USE_COCOA_OR_CARBON
+
#include "wx/region.h"
#ifndef WX_PRECOMP
wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
{
m_refData = new wxRegionRefData(topLeft.x , topLeft.y ,
- topLeft.x - bottomRight.x ,
- topLeft.y - bottomRight.y);
+ bottomRight.x - topLeft.x,
+ bottomRight.y - topLeft.y);
}
wxRegion::wxRegion(const wxRect& rect)
wxUnusedVar(n);
wxUnusedVar(points);
-#if 0
+#if 0
// no non-QD APIs available
// TODO : remove ?
// OS X somehow does not collect the region invisibly as before, so sometimes things
RgnHandle tempRgn = NewRgn();
CloseRgn( tempRgn ) ;
-
+
::SetGWorld( oldWorld, oldGDHandle );
wxCFRef<HIShapeRef> tempShape( HIShapeCreateWithQDRgn(tempRgn ) );
m_refData = new wxRegionRefData(tempShape);
// nothing to do
return true;
+ AllocExclusive();
+
verify_noerr( HIShapeOffset( M_REGION , x , y ) ) ;
return true ;
//! Union /e region with this.
bool wxRegion::DoCombine(const wxRegion& region, wxRegionOp op)
{
- wxCHECK_MSG( region.Ok(), false, wxT("invalid wxRegion") );
+ wxCHECK_MSG( region.IsOk(), false, wxT("invalid wxRegion") );
- // 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);
- }
+ AllocExclusive();
switch (op)
{
//# Information on region
//-----------------------------------------------------------------------------
-bool wxRegion::DoIsEqual(const wxRegion& WXUNUSED(region)) const
+bool wxRegion::DoIsEqual(const wxRegion& region) const
{
- wxFAIL_MSG( wxT("not implemented") );
+ // There doesn't seem to be any native function for checking the equality
+ // of HIShapes so we compute their differences to determine if they are
+ // equal.
+ wxRegion r(*this);
+ r.Subtract(region);
+
+ if ( !r.IsEmpty() )
+ return false;
+
+ wxRegion r2(region);
+ r2.Subtract(*this);
- return false;
+ return r2.IsEmpty();
}
// Outer bounds of region
return true ;
}
-const WXHRGN wxRegion::GetWXHRGN() const
+WXHRGN wxRegion::GetWXHRGN() const
{
return M_REGION ;
}
if (!m_refData)
return wxOutRegion;
- CGPoint p = { y , x } ;
+ CGPoint p = { x, y } ;
if (HIShapeContainsPoint( M_REGION , &p ) )
return wxInRegion;
wxRegionIterator::~wxRegionIterator()
{
- if (m_rects)
- {
- delete [] m_rects;
- m_rects = NULL;
- }
+ wxDELETEA(m_rects);
}
wxRegionIterator::wxRegionIterator(const wxRegionIterator& iterator)
*/
void wxRegionIterator::SetRects(long numRects, wxRect *rects)
{
- if (m_rects)
- {
- delete [] m_rects;
- m_rects = NULL;
- }
+ wxDELETEA(m_rects);
if (rects && (numRects > 0))
{
m_current = 0;
m_region = region;
- if (m_rects)
- {
- delete [] m_rects;
- m_rects = NULL;
- }
+ wxDELETEA(m_rects);
if (m_region.IsEmpty())
{
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
if ( HIShapeEnumerate != NULL )
{
- OSStatus err = HIShapeEnumerate (OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsCounterCallback,
+ OSStatus err = HIShapeEnumerate (OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsCounterCallback,
(void*)&m_numRects);
if (err == noErr)
{
RegionToRectsCallbackData data ;
data.m_rects = m_rects ;
data.m_current = 0 ;
- HIShapeEnumerate( OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsSetterCallback,
+ HIShapeEnumerate( OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsSetterCallback,
(void*)&data );
}
else
RegionToRectsCallbackData data ;
data.m_rects = m_rects ;
data.m_current = 0 ;
- QDRegionToRects( rgn , kQDParseRegionFromTopLeft, wxMacRegionToRectsSetterCallback,
+ QDRegionToRects( rgn , kQDParseRegionFromTopLeft, wxMacRegionToRectsSetterCallback,
(void*)&data );
}
else
return 0;
}
+
+#endif