organizing code, adding offset correction for update region when non native control borders are used, fixes #12229

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65002 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor 2010-07-18 06:16:26 +00:00
parent f960e9e7e5
commit 396f0e3dd4

View File

@ -1077,9 +1077,42 @@ bool wxWidgetCocoaImpl::isFlipped(WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd))
{
// preparing the update region
wxRegion updateRgn;
const NSRect *rects;
NSInteger count;
[slf getRectsBeingDrawn:&rects count:&count];
for ( int i = 0 ; i < count ; ++i )
{
updateRgn.Union(wxFromNSRect(slf, rects[i]));
}
wxWindow* wxpeer = GetWXPeer();
if ( wxpeer->MacGetLeftBorderSize() != 0 || wxpeer->MacGetTopBorderSize() != 0 )
{
// as this update region is in native window locals we must adapt it to wx window local
updateRgn.Offset( wxpeer->MacGetLeftBorderSize() , wxpeer->MacGetTopBorderSize() );
}
if ( wxpeer->MacGetTopLevelWindow()->GetWindowStyle() & wxFRAME_SHAPED )
{
int xoffset = 0, yoffset = 0;
wxRegion rgn = wxpeer->MacGetTopLevelWindow()->GetShape();
wxpeer->MacRootWindowToWindow( &xoffset, &yoffset );
rgn.Offset( xoffset, yoffset );
updateRgn.Intersect(rgn);
}
wxpeer->GetUpdateRegion() = updateRgn;
// setting up the drawing context
CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
CGContextSaveGState( context );
#if OSX_DEBUG_DRAWING
CGContextBeginPath( context );
CGContextMoveToPoint(context, 0, 0);
@ -1094,34 +1127,13 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd))
CGContextClosePath( context );
CGContextStrokePath(context);
#endif
if ( !m_isFlipped )
{
CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height );
CGContextScaleCTM( context, 1, -1 );
}
wxRegion updateRgn;
const NSRect *rects;
NSInteger count;
[slf getRectsBeingDrawn:&rects count:&count];
for ( int i = 0 ; i < count ; ++i )
{
updateRgn.Union(wxFromNSRect(slf, rects[i]));
}
wxWindow* wxpeer = GetWXPeer();
if ( wxpeer->MacGetTopLevelWindow()->GetWindowStyle() & wxFRAME_SHAPED )
{
int xoffset = 0, yoffset = 0;
wxRegion rgn = wxpeer->MacGetTopLevelWindow()->GetShape();
wxpeer->MacRootWindowToWindow( &xoffset, &yoffset );
rgn.Offset( xoffset, yoffset );
updateRgn.Intersect(rgn);
}
wxpeer->GetUpdateRegion() = updateRgn;
wxpeer->MacSetCGContextRef( context );
bool handled = wxpeer->MacDoRedraw( 0 );