/////////////////////////////////////////////////////////////////////////////
-// 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
#include "wx/gdicmn.h"
#endif
-#include "wx/osx/uma.h"
+#include "wx/osx/private.h"
IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
wxUnusedVar(n);
wxUnusedVar(points);
-#ifndef __LP64__
-
- // TODO : any APIs ?
+#if 0
+ // no non-QD APIs available
+ // TODO : remove ?
// OS X somehow does not collect the region invisibly as before, so sometimes things
// get drawn on screen instead of just being combined into a region, therefore we allocate a temp gworld now
RgnHandle tempRgn = NewRgn();
CloseRgn( tempRgn ) ;
-
+
::SetGWorld( oldWorld, oldGDHandle );
wxCFRef<HIShapeRef> tempShape( HIShapeCreateWithQDRgn(tempRgn ) );
m_refData = new wxRegionRefData(tempShape);
// Move the region
bool wxRegion::DoOffset(wxCoord x, wxCoord y)
{
- wxCHECK_MSG( M_REGION, false, _T("invalid wxRegion") );
+ wxCHECK_MSG( M_REGION, false, wxT("invalid wxRegion") );
if ( !x && !y )
// nothing to do
//! Union /e region with this.
bool wxRegion::DoCombine(const wxRegion& region, wxRegionOp op)
{
- wxCHECK_MSG( region.Ok(), false, _T("invalid wxRegion") );
+ wxCHECK_MSG( region.Ok(), false, wxT("invalid wxRegion") );
// Don't change shared data
if (!m_refData)
bool wxRegion::DoIsEqual(const wxRegion& WXUNUSED(region)) const
{
- wxFAIL_MSG( _T("not implemented") );
+ wxFAIL_MSG( wxT("not implemented") );
return false;
}
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))
{
* Reset iterator for a new /e region.
*/
-#ifndef __LP64__
+class RegionToRectsCallbackData
+{
+public :
+ wxRect* m_rects ;
+ long m_current ;
+};
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+
OSStatus wxMacRegionToRectsCounterCallback(
UInt16 message, RgnHandle WXUNUSED(region), const Rect *WXUNUSED(rect), void *data )
{
return noErr;
}
-class RegionToRectsCallbackData
-{
-public :
- wxRect* m_rects ;
- long m_current ;
-};
-
OSStatus wxMacRegionToRectsSetterCallback(
UInt16 message, RgnHandle WXUNUSED(region), const Rect *rect, void *data )
{
return noErr;
}
+
+#endif
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+
+OSStatus wxOSXRegionToRectsCounterCallback(
+ int message, HIShapeRef WXUNUSED(region), const CGRect *WXUNUSED(rect), void *data )
+{
+ long *m_numRects = (long*) data ;
+ if ( message == kHIShapeEnumerateInit )
+ {
+ (*m_numRects) = 0 ;
+ }
+ else if (message == kHIShapeEnumerateRect)
+ {
+ (*m_numRects) += 1 ;
+ }
+
+ return noErr;
+}
+
+OSStatus wxOSXRegionToRectsSetterCallback(
+ int message, HIShapeRef WXUNUSED(region), const CGRect *rect, void *data )
+{
+ if (message == kHIShapeEnumerateRect)
+ {
+ RegionToRectsCallbackData *cb = (RegionToRectsCallbackData*) data ;
+ cb->m_rects[cb->m_current++] = wxRect( rect->origin.x , rect->origin.y , rect->size.width , rect->size.height ) ;
+ }
+
+ return noErr;
+}
+
#endif
void wxRegionIterator::Reset(const wxRegion& region)
m_current = 0;
m_region = region;
- if (m_rects)
- {
- delete [] m_rects;
- m_rects = NULL;
- }
+ wxDELETEA(m_rects);
if (m_region.IsEmpty())
{
}
else
{
-#ifdef __LP64__
+#if 0
+ // fallback code in case we ever need it again
// copying this to a path and dissecting the path would be an option
m_numRects = 1;
m_rects = new wxRect[m_numRects];
m_rects[0] = m_region.GetBox();
+#endif
-#else
- RegionToRectsUPP proc = (RegionToRectsUPP) wxMacRegionToRectsCounterCallback;
-
- OSStatus err = noErr;
- RgnHandle rgn = NewRgn();
- HIShapeGetAsQDRgn(OTHER_M_REGION(region), rgn);
-
- err = QDRegionToRects (rgn, kQDParseRegionFromTopLeft, proc, (void*)&m_numRects);
- if (err == noErr)
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if ( HIShapeEnumerate != NULL )
{
- proc = (RegionToRectsUPP) wxMacRegionToRectsSetterCallback;
- m_rects = new wxRect[m_numRects];
- RegionToRectsCallbackData data ;
- data.m_rects = m_rects ;
- data.m_current = 0 ;
- QDRegionToRects( rgn , kQDParseRegionFromTopLeft, proc, (void*)&data );
+ OSStatus err = HIShapeEnumerate (OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsCounterCallback,
+ (void*)&m_numRects);
+ if (err == noErr)
+ {
+ m_rects = new wxRect[m_numRects];
+ RegionToRectsCallbackData data ;
+ data.m_rects = m_rects ;
+ data.m_current = 0 ;
+ HIShapeEnumerate( OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsSetterCallback,
+ (void*)&data );
+ }
+ else
+ {
+ m_numRects = 0;
+ }
}
else
+#endif
{
- m_numRects = 0;
- }
- DisposeRgn( rgn );
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ OSStatus err = noErr;
+ RgnHandle rgn = NewRgn();
+ HIShapeGetAsQDRgn(OTHER_M_REGION(region), rgn);
+
+ err = QDRegionToRects (rgn, kQDParseRegionFromTopLeft, wxMacRegionToRectsCounterCallback
+ , (void*)&m_numRects);
+ if (err == noErr)
+ {
+ m_rects = new wxRect[m_numRects];
+ RegionToRectsCallbackData data ;
+ data.m_rects = m_rects ;
+ data.m_current = 0 ;
+ QDRegionToRects( rgn , kQDParseRegionFromTopLeft, wxMacRegionToRectsSetterCallback,
+ (void*)&data );
+ }
+ else
+ {
+ m_numRects = 0;
+ }
+ DisposeRgn( rgn );
#endif
+ }
}
}
return 0;
}
+
+#endif