X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3d1a4878f36ba4b5f66c2ccfd2cb27a9dc528b6f..b28a58d71c645a11d5ccacecbff78bfe58683105:/src/mac/carbon/region.cpp diff --git a/src/mac/carbon/region.cpp b/src/mac/carbon/region.cpp index f0054d35bc..3fb09a1ad2 100644 --- a/src/mac/carbon/region.cpp +++ b/src/mac/carbon/region.cpp @@ -18,10 +18,8 @@ #include "wx/gdicmn.h" #include "wx/mac/uma.h" -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject) - IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject) -#endif +IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject) +IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject) //----------------------------------------------------------------------------- // wxRegionRefData implementation @@ -399,6 +397,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; @@ -413,15 +445,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); } }