bool wxNonOwnedWindow::DoSetRegionShape(const wxRegion& region) { QPixmap pixmap(GetHandle()->size()); QPainter painter(&pixmap); painter.fillRect(pixmap.rect(), Qt::white); painter.setClipRegion(region.GetHandle()); painter.fillRect(pixmap.rect(), Qt::black); GetHandle()->setMask(pixmap.createMaskFromColor(Qt::white)); return 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; } }