void wxQtDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { // Special case: Empty region -> DestroyClippingRegion() if ( width == 0 && height == 0 ) { DestroyClippingRegion(); } else { if (m_qtPainter->isActive()) { // Set QPainter clipping (intersection if not the first one) m_qtPainter->setClipRect( x, y, width, height, m_clipping ? Qt::IntersectClip : Qt::ReplaceClip ); } // Set internal state for getters /* Note: Qt states that QPainter::clipRegion() may be slow, so we * keep the region manually, which should be faster */ if ( m_clipping ) m_clippingRegion->Union( wxRect( x, y, width, height ) ); else m_clippingRegion->Intersect( wxRect( x, y, width, height ) ); wxRect clipRect = m_clippingRegion->GetBox(); m_clipX1 = clipRect.GetLeft(); m_clipX2 = clipRect.GetRight(); m_clipY1 = clipRect.GetTop(); m_clipY2 = clipRect.GetBottom(); m_clipping = true; } }
void wxQtDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { // Special case: Empty region -> DestroyClippingRegion() if ( width == 0 && height == 0 ) { DestroyClippingRegion(); } else { if ( width < 0 ) { width = -width; x -= width - 1; } if ( height < 0 ) { height = -height; y -= height - 1; } if (m_qtPainter->isActive()) { // Set QPainter clipping (intersection if not the first one) m_qtPainter->setClipRect( x, y, width, height, m_clipping ? Qt::IntersectClip : Qt::ReplaceClip ); } // Set internal state for getters /* Note: Qt states that QPainter::clipRegion() may be slow, so we * keep the region manually, which should be faster */ if ( !m_clipping || m_clippingRegion.IsEmpty() ) { int dcwidth, dcheight; DoGetSize(&dcwidth, &dcheight); m_clippingRegion = wxRegion(0, 0, dcwidth, dcheight); } m_clippingRegion.Intersect( wxRect(x, y, width, height) ); wxRect clipRect = m_clippingRegion.GetBox(); m_clipX1 = clipRect.GetLeft(); m_clipX2 = clipRect.GetRight() + 1; m_clipY1 = clipRect.GetTop(); m_clipY2 = clipRect.GetBottom() + 1; m_clipping = true; } }
void wxQtDCImpl::DoSetDeviceClippingRegion(const wxRegion& region) { if ( region.IsEmpty() ) { DestroyClippingRegion(); } else { QRegion qregion = region.GetHandle(); // Save current origin / scale (logical coordinates) QTransform qtrans = m_qtPainter->worldTransform(); // Reset transofrmation to match device coordinates m_qtPainter->setWorldTransform( QTransform() ); wxLogDebug(wxT("wxQtDCImpl::DoSetDeviceClippingRegion rect %d %d %d %d"), qregion.boundingRect().x(), qregion.boundingRect().y(), qregion.boundingRect().width(), qregion.boundingRect().height()); // Set QPainter clipping (intersection if not the first one) m_qtPainter->setClipRegion( qregion, m_clipping ? Qt::IntersectClip : Qt::ReplaceClip ); // Restore the transformation (translation / scale): m_qtPainter->setWorldTransform( qtrans ); // Set internal state for getters /* Note: Qt states that QPainter::clipRegion() may be slow, so we * keep the region manually, which should be faster */ if ( m_clipping ) m_clippingRegion->Union( region ); else m_clippingRegion->Intersect( region ); wxRect clipRect = m_clippingRegion->GetBox(); m_clipX1 = clipRect.GetLeft(); m_clipX2 = clipRect.GetRight(); m_clipY1 = clipRect.GetTop(); m_clipY2 = clipRect.GetBottom(); m_clipping = true; } }