void wxGTKDCImpl::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) { wxASSERT_MSG( width >= 0 && height >= 0, "Clipping box size values cannot be negative" ); wxRect newRegion(x, y, width, height); wxRect clipRegion; 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); clipRegion = curRegion.Intersect(newRegion); } else { // Effective clipping box is an intersection // of required clipping box and DC surface. int dcWidth, dcHeight; DoGetSize(&dcWidth, &dcHeight); wxRect dcRect(DeviceToLogicalX(0), DeviceToLogicalY(0), DeviceToLogicalXRel(dcWidth), DeviceToLogicalYRel(dcHeight)); clipRegion = dcRect.Intersect(newRegion); m_clipping = true; } if ( clipRegion.IsEmpty() ) { m_clipX1 = m_clipY1 = m_clipX2 = m_clipY2 = 0; } else { m_clipX1 = clipRegion.GetLeftTop().x; m_clipY1 = clipRegion.GetLeftTop().y; m_clipX2 = clipRegion.GetBottomRight().x + 1; m_clipY2 = clipRegion.GetBottomRight().y + 1; } }
void wxGCDCImpl::DoSetDeviceClippingRegion( const wxRegion ®ion ) { // region is in device coordinates wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoSetDeviceClippingRegion - invalid DC") ); // Convert device coordinates to logical coordinates // for all region components. wxRegion logRegion; if ( region.IsEmpty() ) { // Empty region is skipped by iterator // so we have to copy it directly. logRegion = region; } else { wxRegionIterator ri(region); while (ri) { logRegion.Union(DeviceToLogicalX(ri.GetX()), DeviceToLogicalY(ri.GetY()), DeviceToLogicalXRel(ri.GetWidth()), DeviceToLogicalYRel(ri.GetHeight())); ++ri; } } m_graphicContext->Clip(logRegion); wxRect newRegion = logRegion.GetBox(); wxRect clipRegion; 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); clipRegion = curRegion.Intersect(newRegion); } else { // Effective clipping box is an intersection // of required clipping box and DC surface. int dcWidth, dcHeight; DoGetSize(&dcWidth, &dcHeight); wxRect dcRect(DeviceToLogicalX(0), DeviceToLogicalY(0), DeviceToLogicalXRel(dcWidth), DeviceToLogicalYRel(dcHeight)); clipRegion = dcRect.Intersect(newRegion); m_clipping = true; } if ( clipRegion.IsEmpty() ) { m_clipX1 = m_clipY1 = m_clipX2 = m_clipY2 = 0; } else { m_clipX1 = clipRegion.GetLeft(); m_clipY1 = clipRegion.GetTop(); m_clipX2 = clipRegion.GetRight() + 1; m_clipY2 = clipRegion.GetBottom() + 1; } }