From 12eaa61930dcb5067dab19157897e22562754423 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Sun, 21 Aug 2016 21:03:16 +0200 Subject: [PATCH] Fix wxGCDC::Clear 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. See #17636. --- docs/changes.txt | 1 + src/common/dcgraph.cpp | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/changes.txt b/docs/changes.txt index 7c911fd9f5..d35373ea98 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -98,6 +98,7 @@ All (GUI): - Fix displaying validation errors for numeric wxPropertyGrid properties. - Add wxSYS_CARET_{ON,OFF,TIMEOUT}_MSEC system settings (brawer). - Add wxGraphicsContext::GetClipBox(). +- Fix wxGCDC::Clear() for rotated graphics context. wxGTK: diff --git a/src/common/dcgraph.cpp b/src/common/dcgraph.cpp index 51daf83006..b98ceff60b 100644 --- a/src/common/dcgraph.cpp +++ b/src/common/dcgraph.cpp @@ -1189,17 +1189,30 @@ wxCoord wxGCDCImpl::GetCharHeight(void) const void wxGCDCImpl::Clear(void) { wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::Clear - invalid DC") ); - // TODO better implementation / incorporate size info into wxGCDC or context m_graphicContext->SetBrush( m_backgroundBrush ); wxPen p = *wxTRANSPARENT_PEN; 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 );