Fix wxGCDC::Clear (wxOSX)

If underlying graphics context is rotated then drawing a rectangle with origin at (0,0) doesn't cover all the drawing area. To draw over entire area we need to get extents of the actual clipping region (with applied all transformations) and use it as coordinates of the drawn rectangle.
Solution for wxMSW and wxGTK was implemented in 12eaa61212eaa61930.

See #17636.
This commit is contained in:
Artur Wieczorek
2017-07-02 13:46:18 +02:00
parent f311807112
commit 214ed20697
2 changed files with 2 additions and 24 deletions

View File

@@ -1257,40 +1257,20 @@ void wxGCDCImpl::Clear(void)
m_graphicContext->SetPen( p );
wxCompositionMode formerMode = m_graphicContext->GetCompositionMode();
m_graphicContext->SetCompositionMode(wxCOMPOSITION_SOURCE);
#ifdef __WXOSX__
// This is a legacy implementation which doesn't take advantage
// of clipping region bounds retrieved by wxMacCoreGraphicsContext::GetClipBox
// because this function is not yet verified.
// Note: Legacy implmentation might not work work properly
// if graphics context is rotated
// TODO: Do the tests of wxMacCoreGraphicsContext::GetClipBox
// and switch to the implmenentation used by other renderers (code below).
//
// maximum positive coordinate Cairo can handle is 2^23 - 1
// Use a value slightly less than this to be sure we avoid the limit
DoDrawRectangle(
DeviceToLogicalX(0), DeviceToLogicalY(0),
DeviceToLogicalXRel(0x800000 - 64), DeviceToLogicalYRel(0x800000 - 64));
#else
double x, y, w, h;
m_graphicContext->GetClipBox(&x, &y, &w, &h);
m_graphicContext->DrawRectangle(x, y, w, h);
#endif // __WXOSX__ / !__WXOSX__
m_graphicContext->SetCompositionMode(formerMode);
m_graphicContext->SetPen( m_pen );
m_graphicContext->SetBrush( m_brush );
}
else
{
#ifdef __WXOSX__
// same comment as above applies
m_graphicContext->ClearRectangle(DeviceToLogicalX(0), DeviceToLogicalY(0),
DeviceToLogicalXRel(0x8000 - 64), DeviceToLogicalYRel(0x8000 - 64));
#else
double x, y, w, h;
m_graphicContext->GetClipBox(&x, &y, &w, &h);
m_graphicContext->ClearRectangle(x, y, w, h);
#endif
}
}