void wxGCDCImpl::DestroyClippingRegion() { m_graphicContext->ResetClip(); // currently the clip eg of a window extends to the area between the scrollbars // so we must explicitly make sure it only covers the area we want it to draw int width, height ; GetOwner()->GetSize( &width , &height ) ; m_graphicContext->Clip( DeviceToLogicalX(0) , DeviceToLogicalY(0) , DeviceToLogicalXRel(width), DeviceToLogicalYRel(height) ); m_graphicContext->SetPen( m_pen ); m_graphicContext->SetBrush( m_brush ); ResetClipping(); }
void wxGCDCImpl::Clear(void) { wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::Clear - invalid DC") ); // TODO better implementation / incorporate size info into wxGCDC or context m_graphicContext->SetBrush( m_backgroundBrush ); wxPen p = *wxTRANSPARENT_PEN; m_graphicContext->SetPen( p ); wxCompositionMode formerMode = m_graphicContext->GetCompositionMode(); m_graphicContext->SetCompositionMode(wxCOMPOSITION_SOURCE); // maximum positive coordinate Cairo can handle is 2^23 - 1 DoDrawRectangle( DeviceToLogicalX(0), DeviceToLogicalY(0), DeviceToLogicalXRel(0x007fffff), DeviceToLogicalYRel(0x007fffff)); m_graphicContext->SetCompositionMode(formerMode); m_graphicContext->SetPen( m_pen ); m_graphicContext->SetBrush( m_brush ); }
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; } }