Store clipping box coordinates in device units for generic wxDC

Clipping box coordinates should be stored internally in device units
to be independent on changes of logical coordinates made between calls
to wxDCImpl::DoSetClippingRegion().
These stored coordinates should be converted on demand to the current
logical units on call to wxDCImpl::DoGetClippingRect().
This commit is contained in:
Artur Wieczorek
2021-07-26 21:04:21 +02:00
parent 30a4090ac9
commit 2bcc9382a7
2 changed files with 8 additions and 7 deletions

View File

@@ -742,7 +742,8 @@ protected:
// bounding and clipping boxes // bounding and clipping boxes
wxCoord m_minX, m_minY, m_maxX, m_maxY; // Bounding box is stored in device units. wxCoord m_minX, m_minY, m_maxX, m_maxY; // Bounding box is stored in device units.
wxCoord m_clipX1, m_clipY1, m_clipX2, m_clipY2; // Clipping box is stored in logical units. wxCoord m_clipX1, m_clipY1, m_clipX2, m_clipY2; // Clipping box is stored in device units.
// Derived classes may store it in logical units.
wxRasterOperationMode m_logicalFunction; wxRasterOperationMode m_logicalFunction;
int m_backgroundMode; int m_backgroundMode;

View File

@@ -362,7 +362,7 @@ void wxDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
wxASSERT_MSG( w >= 0 && h >= 0, wxASSERT_MSG( w >= 0 && h >= 0,
wxS("Clipping box size values cannot be negative") ); wxS("Clipping box size values cannot be negative") );
wxRect clipRegion(x, y, w, h); wxRect clipRegion(LogicalToDevice(x, y), LogicalToDeviceRel(w, h));
if ( m_clipping ) if ( m_clipping )
{ {
@@ -377,7 +377,7 @@ void wxDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
// of required clipping box and DC surface. // of required clipping box and DC surface.
int dcWidth, dcHeight; int dcWidth, dcHeight;
DoGetSize(&dcWidth, &dcHeight); DoGetSize(&dcWidth, &dcHeight);
wxRect dcRect(DeviceToLogical(0, 0), DeviceToLogicalRel(dcWidth, dcHeight)); wxRect dcRect(0, 0, dcWidth, dcHeight);
clipRegion.Intersect(dcRect); clipRegion.Intersect(dcRect);
m_clipping = true; m_clipping = true;
@@ -420,10 +420,10 @@ bool wxDCImpl::DoGetClippingRect(wxRect& rect) const
if ( m_clipping ) if ( m_clipping )
{ {
rect = wxRect(m_clipX1, if ( m_clipX1 == m_clipX2 || m_clipY1 == m_clipY2 )
m_clipY1, rect = wxRect(); // empty clip region
m_clipX2 - m_clipX1, else
m_clipY2 - m_clipY1); rect = wxRect(DeviceToLogical(m_clipX1, m_clipY1), DeviceToLogicalRel(m_clipX2 - m_clipX1, m_clipY2 - m_clipY1));
return true; return true;
} }