X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/92a942606f533876c5247fbfb09ff34803449537..97e49559fb0e1dfc43d66e8784ec47182f5507e9:/src/common/dcgraph.cpp diff --git a/src/common/dcgraph.cpp b/src/common/dcgraph.cpp index 481f256d2a..42f58a3721 100644 --- a/src/common/dcgraph.cpp +++ b/src/common/dcgraph.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/common/graphcmn.cpp +// Name: src/common/dcgraph.cpp // Purpose: graphics context methods common to all platforms // Author: Stefan Csomor // Modified by: @@ -57,8 +57,10 @@ static bool TranslateRasterOp(wxRasterOperationMode function, wxCompositionMode { switch ( function ) { - case wxCOPY: // (default) src - *op = wxCOMPOSITION_SOURCE; // + case wxCOPY: // src + // since we are supporting alpha, _OVER is closer to the intention than _SOURCE + // since the latter would overwrite even when alpha is not set to opaque + *op = wxCOMPOSITION_OVER; break; case wxOR: // src OR dst *op = wxCOMPOSITION_ADD; @@ -72,7 +74,7 @@ static bool TranslateRasterOp(wxRasterOperationMode function, wxCompositionMode case wxXOR: // src XOR dst *op = wxCOMPOSITION_XOR; break; - + case wxAND: // src AND dst case wxAND_INVERT: // (NOT src) AND dst case wxAND_REVERSE:// src AND (NOT dst) @@ -172,7 +174,15 @@ wxGCDCImpl::wxGCDCImpl( wxDC *owner, const wxMemoryDC& dc ) : wxDCImpl( owner ) { Init(); - SetGraphicsContext( wxGraphicsContext::Create(dc) ); + wxGraphicsContext* context; +#if wxUSE_CAIRO + wxGraphicsRenderer* renderer = wxGraphicsRenderer::GetCairoRenderer(); + context = renderer->CreateContext(dc); +#else + context = wxGraphicsContext::Create(dc); +#endif + + SetGraphicsContext( context ); } #if wxUSE_PRINTING_ARCHITECTURE @@ -195,7 +205,7 @@ void wxGCDCImpl::Init() m_font = *wxNORMAL_FONT; m_brush = *wxWHITE_BRUSH; - m_graphicContext = NULL; + m_graphicContext = wxGraphicsContext::Create(); m_logicalFunctionSupported = true; } @@ -265,9 +275,7 @@ void wxGCDCImpl::EndPage() void wxGCDCImpl::Flush() { -#ifdef __WXOSX_OR_COCOA__ - CGContextFlush( (CGContextRef) m_graphicContext->GetNativeContext() ); -#endif + m_graphicContext->Flush(); } void wxGCDCImpl::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord w, wxCoord h ) @@ -333,7 +341,7 @@ void wxGCDCImpl::DestroyClippingRegion() { m_graphicContext->ResetClip(); // currently the clip eg of a window extends to the area between the scrollbars - // so we must explicitely make sure it only covers the area we want it to draw + // 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) ); @@ -450,12 +458,6 @@ void wxGCDCImpl::SetFont( const wxFont &font ) if ( f.IsOk() ) f.SetPointSize( /*LogicalToDeviceYRel*/(font.GetPointSize())); m_graphicContext->SetFont( f, m_textForegroundColour ); -#if defined(__WXGTK__) || defined(__WXOSX__) - if ( m_font.GetNoAntiAliasing() ) - { - m_graphicContext->SetAntialiasMode(wxANTIALIAS_NONE); - } -#endif } } @@ -499,20 +501,20 @@ void wxGCDCImpl::SetLogicalFunction( wxRasterOperationMode function ) return; m_logicalFunction = function; - + wxCompositionMode mode; m_logicalFunctionSupported = TranslateRasterOp( function, &mode); if (m_logicalFunctionSupported) m_logicalFunctionSupported = m_graphicContext->SetCompositionMode(mode); - - if (mode == wxCOMPOSITION_XOR) + + if ( function == wxXOR ) m_graphicContext->SetAntialiasMode(wxANTIALIAS_NONE); else m_graphicContext->SetAntialiasMode(wxANTIALIAS_DEFAULT); } bool wxGCDCImpl::DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), - const wxColour& WXUNUSED(col), + const wxColour& WXUNUSED(col), wxFloodFillStyle WXUNUSED(style)) { return false; @@ -675,7 +677,7 @@ void wxGCDCImpl::DoDrawSpline(const wxPointList *points) wxGraphicsPath path = m_graphicContext->CreatePath(); wxPointList::compatibility_iterator node = points->GetFirst(); - if (node == wxPointList::compatibility_iterator()) + if ( !node ) // empty list return; @@ -694,13 +696,13 @@ void wxGCDCImpl::DoDrawSpline(const wxPointList *points) path.MoveToPoint( x1 , y1 ); path.AddLineToPoint( cx1 , cy1 ); -#if !wxUSE_STL +#if !wxUSE_STD_CONTAINERS while ((node = node->GetNext()) != NULL) #else while ((node = node->GetNext())) -#endif // !wxUSE_STL +#endif // !wxUSE_STD_CONTAINERS { p = node->GetData(); @@ -851,7 +853,7 @@ bool wxGCDCImpl::CanDrawBitmap() const bool wxGCDCImpl::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, - wxDC *source, wxCoord xsrc, wxCoord ysrc, + wxDC *source, wxCoord xsrc, wxCoord ysrc, wxRasterOperationMode logical_func , bool useMask, wxCoord xsrcMask, wxCoord ysrcMask ) { @@ -871,7 +873,7 @@ bool wxGCDCImpl::DoStretchBlit( if ( logical_func == wxNO_OP ) return true; - + wxCompositionMode mode; if ( !TranslateRasterOp(logical_func, &mode) ) { @@ -880,7 +882,7 @@ bool wxGCDCImpl::DoStretchBlit( } bool retval = true; - + wxCompositionMode formerMode = m_graphicContext->GetCompositionMode(); if (m_graphicContext->SetCompositionMode(mode)) { @@ -889,7 +891,7 @@ bool wxGCDCImpl::DoStretchBlit( { m_graphicContext->SetAntialiasMode(wxANTIALIAS_NONE); } - + if (xsrcMask == -1 && ysrcMask == -1) { xsrcMask = xsrc; @@ -926,7 +928,7 @@ bool wxGCDCImpl::DoStretchBlit( wxFAIL_MSG( wxT("Cannot Blit. Unable to get contents of DC as bitmap.") ); retval = false; } - + if (mode == wxCOMPOSITION_XOR) { m_graphicContext->SetAntialiasMode(formerAa); @@ -943,7 +945,7 @@ void wxGCDCImpl::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, { wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoDrawRotatedText - invalid DC") ); - if ( str.length() == 0 ) + if ( str.empty() ) return; if ( !m_logicalFunctionSupported ) return; @@ -958,7 +960,7 @@ void wxGCDCImpl::DoDrawText(const wxString& str, wxCoord x, wxCoord y) { wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoDrawText - invalid DC") ); - if ( str.length() == 0 ) + if ( str.empty() ) return; if ( !m_logicalFunctionSupported ) @@ -981,7 +983,7 @@ void wxGCDCImpl::DoGetTextExtent( const wxString &str, wxCoord *width, wxCoord * wxCoord *descent, wxCoord *externalLeading , const wxFont *theFont ) const { - wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoGetTextExtent - invalid DC") ); + wxCHECK_RET( m_graphicContext, wxT("wxGCDC(cg)::DoGetTextExtent - invalid DC") ); if ( theFont ) { @@ -1009,7 +1011,7 @@ void wxGCDCImpl::DoGetTextExtent( const wxString &str, wxCoord *width, wxCoord * bool wxGCDCImpl::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const { - wxCHECK_MSG( IsOk(), false, wxT("wxGCDC(cg)::DoGetPartialTextExtents - invalid DC") ); + wxCHECK_MSG( m_graphicContext, false, wxT("wxGCDC(cg)::DoGetPartialTextExtents - invalid DC") ); widths.Clear(); widths.Add(0,text.Length()); if ( text.IsEmpty() ) @@ -1047,7 +1049,10 @@ void wxGCDCImpl::Clear(void) m_graphicContext->SetBrush( m_backgroundBrush ); wxPen p = *wxTRANSPARENT_PEN; m_graphicContext->SetPen( p ); + wxCompositionMode formerMode = m_graphicContext->GetCompositionMode(); + m_graphicContext->SetCompositionMode(wxCOMPOSITION_SOURCE); DoDrawRectangle( 0, 0, 32000 , 32000 ); + m_graphicContext->SetCompositionMode(formerMode); m_graphicContext->SetPen( m_pen ); m_graphicContext->SetBrush( m_brush ); }