Store clipping box in device units only if it's set with wxDCImpl::DoSetClippingRegion
If derived class sets clipping region in a legitimate way by call to DoSetClippingRegion() instead of directly storing logical coordinates of the box in the internal variables we can store coordinates in device units to determine final logical coordinates more reliably even in case when coordinate transformations were applied to DC in the meantime.
This commit is contained in:
@@ -345,6 +345,8 @@ wxDCImpl::wxDCImpl( wxDC *owner )
|
||||
, m_palette()
|
||||
, m_hasCustomPalette(false)
|
||||
#endif // wxUSE_PALETTE
|
||||
, m_devClipX1(0), m_devClipY1(0), m_devClipX2(0), m_devClipY2(0)
|
||||
, m_useDevClipCoords(false)
|
||||
{
|
||||
m_owner = owner;
|
||||
}
|
||||
@@ -362,13 +364,16 @@ void wxDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
|
||||
wxASSERT_MSG( w >= 0 && h >= 0,
|
||||
wxS("Clipping box size values cannot be negative") );
|
||||
|
||||
// If we set clipping box with this method we can operate on device coordinates
|
||||
// and calculate clipping box properly also when transfromations were applied to DC.
|
||||
m_useDevClipCoords = true;
|
||||
wxRect clipRegion(LogicalToDevice(x, y), LogicalToDeviceRel(w, h));
|
||||
|
||||
if ( m_clipping )
|
||||
{
|
||||
// New clipping box is an intersection
|
||||
// of required clipping box and the current one.
|
||||
wxRect curRegion(m_clipX1, m_clipY1, m_clipX2 - m_clipX1, m_clipY2 - m_clipY1);
|
||||
wxRect curRegion(m_devClipX1, m_devClipY1, m_devClipX2 - m_devClipX1, m_devClipY2 - m_devClipY1);
|
||||
clipRegion.Intersect(curRegion);
|
||||
}
|
||||
else
|
||||
@@ -385,14 +390,14 @@ void wxDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
|
||||
|
||||
if ( clipRegion.IsEmpty() )
|
||||
{
|
||||
m_clipX1 = m_clipY1 = m_clipX2 = m_clipY2 = 0;
|
||||
m_devClipX1 = m_devClipY1 = m_devClipX2 = m_devClipY2 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_clipX1 = clipRegion.GetLeft();
|
||||
m_clipY1 = clipRegion.GetTop();
|
||||
m_clipX2 = clipRegion.GetRight() + 1;
|
||||
m_clipY2 = clipRegion.GetBottom() + 1;
|
||||
m_devClipX1 = clipRegion.GetLeft();
|
||||
m_devClipY1 = clipRegion.GetTop();
|
||||
m_devClipX2 = clipRegion.GetRight() + 1;
|
||||
m_devClipY2 = clipRegion.GetBottom() + 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,11 +425,18 @@ bool wxDCImpl::DoGetClippingRect(wxRect& rect) const
|
||||
|
||||
if ( m_clipping )
|
||||
{
|
||||
if ( m_clipX1 == m_clipX2 || m_clipY1 == m_clipY2 )
|
||||
rect = wxRect(); // empty clip region
|
||||
if ( m_useDevClipCoords )
|
||||
{
|
||||
if ( m_devClipX1 == m_devClipX2 || m_devClipY1 == m_devClipY2 )
|
||||
rect = wxRect(); // empty clip region
|
||||
else
|
||||
rect = wxRect(DeviceToLogical(m_devClipX1, m_devClipY1), DeviceToLogicalRel(m_devClipX2 - m_devClipX1, m_devClipY2 - m_devClipY1));
|
||||
}
|
||||
else
|
||||
rect = wxRect(DeviceToLogical(m_clipX1, m_clipY1), DeviceToLogicalRel(m_clipX2 - m_clipX1, m_clipY2 - m_clipY1));
|
||||
|
||||
{
|
||||
// When derived class set coordinates in logical units directly...
|
||||
rect = wxRect(m_clipX1, m_clipY1, m_clipX2 - m_clipX1, m_clipY2 - m_clipY1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else // No active clipping region.
|
||||
|
||||
Reference in New Issue
Block a user