Fix wxDC::GetClippingBox() in wxQt

This commit is contained in:
ali kettab 2023-06-02 18:38:08 +01:00
parent dd01db12ed
commit f26f1cc701
2 changed files with 57 additions and 0 deletions

View file

@ -50,6 +50,9 @@ public:
virtual void Clear() override;
void UpdateClipBox();
virtual bool DoGetClippingRect(wxRect& rect) const override;
virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
wxCoord width, wxCoord height) override;
@ -117,6 +120,9 @@ protected:
QPixmap *m_qtPixmap;
wxRegion m_clippingRegion;
bool m_isClipBoxValid = false;
private:
enum wxQtRasterColourOp
{

View file

@ -422,6 +422,53 @@ void wxQtDCImpl::Clear()
DeviceToLogicalYRel(height) );
}
void wxQtDCImpl::UpdateClipBox()
{
if ( m_clippingRegion.IsEmpty() )
{
int dcwidth, dcheight;
DoGetSize(&dcwidth, &dcheight);
m_qtPainter->setClipRect(DeviceToLogicalX(0),
DeviceToLogicalY(0),
DeviceToLogicalXRel(dcwidth),
DeviceToLogicalYRel(dcheight),
m_clipping ? Qt::IntersectClip : Qt::ReplaceClip);
}
/* Note: Qt states that QPainter::clipRegion() may be slow, so we
* keep the region manually, which should be faster. A comment in
* QPainter::clipBoundingRect() source says: This is not 100% precise,
* but it fits within the guarantee and it is reasonably fast.
*/
m_clippingRegion.QtSetRegion(
QRegion(m_qtPainter->clipBoundingRect().toRect()) );
wxRect clipRect = m_clippingRegion.GetBox();
m_clipX1 = clipRect.GetLeft();
m_clipX2 = clipRect.GetRight() + 1;
m_clipY1 = clipRect.GetTop();
m_clipY2 = clipRect.GetBottom() + 1;
m_isClipBoxValid = true;
}
bool wxQtDCImpl::DoGetClippingRect(wxRect& rect) const
{
// Check if we should try to retrieve the clipping region possibly not set
// by our SetClippingRegion() but preset or modified by application: this
// can happen when wxDC logical coordinates are transformed with
// SetDeviceOrigin(), SetLogicalOrigin(), SetUserScale(), SetLogicalScale().
if ( !m_isClipBoxValid )
{
wxQtDCImpl *self = wxConstCast(this, wxQtDCImpl);
self->UpdateClipBox();
}
return wxDCImpl::DoGetClippingRect(rect);
}
void wxQtDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y,
wxCoord width, wxCoord height)
{
@ -517,6 +564,8 @@ void wxQtDCImpl::DestroyClippingRegion()
if (m_qtPainter->isActive())
m_qtPainter->setClipping( false );
m_isClipBoxValid = false;
}
bool wxQtDCImpl::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col,
@ -884,4 +933,6 @@ void wxQtDCImpl::ComputeScaleAndOrigin()
// Apply transform to QPainter, overwriting the previous one
m_qtPainter->setWorldTransform(t, false);
m_isClipBoxValid = false;
}