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:
@@ -1077,9 +1077,42 @@ bool wxWidgetCocoaImpl::isFlipped(WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd))
|
|||||||
|
|
||||||
void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget 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];
|
CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
|
||||||
CGContextSaveGState( context );
|
CGContextSaveGState( context );
|
||||||
|
|
||||||
#if OSX_DEBUG_DRAWING
|
#if OSX_DEBUG_DRAWING
|
||||||
CGContextBeginPath( context );
|
CGContextBeginPath( context );
|
||||||
CGContextMoveToPoint(context, 0, 0);
|
CGContextMoveToPoint(context, 0, 0);
|
||||||
@@ -1094,34 +1127,13 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd))
|
|||||||
CGContextClosePath( context );
|
CGContextClosePath( context );
|
||||||
CGContextStrokePath(context);
|
CGContextStrokePath(context);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( !m_isFlipped )
|
if ( !m_isFlipped )
|
||||||
{
|
{
|
||||||
CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height );
|
CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height );
|
||||||
CGContextScaleCTM( context, 1, -1 );
|
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 );
|
wxpeer->MacSetCGContextRef( context );
|
||||||
|
|
||||||
bool handled = wxpeer->MacDoRedraw( 0 );
|
bool handled = wxpeer->MacDoRedraw( 0 );
|
||||||
|
Reference in New Issue
Block a user