X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89efaf2b6595e59af618556d7e79492cab50c73c..b00403b401b75f95b6984cf5d0f6d71492f0a1f9:/src/common/dcgraph.cpp diff --git a/src/common/dcgraph.cpp b/src/common/dcgraph.cpp index 4a713993a8..66a531bb47 100644 --- a/src/common/dcgraph.cpp +++ b/src/common/dcgraph.cpp @@ -53,6 +53,43 @@ static inline double DegToRad(double deg) return (deg * M_PI) / 180.0; } +static bool TranslateRasterOp(wxRasterOperationMode function, wxCompositionMode *op) +{ + switch ( function ) + { + case wxCOPY: // (default) src + *op = wxCOMPOSITION_SOURCE; // + break; + case wxOR: // src OR dst + *op = wxCOMPOSITION_ADD; + break; + case wxNO_OP: // dst + *op = wxCOMPOSITION_DEST; // ignore the source + break; + case wxCLEAR: // 0 + *op = wxCOMPOSITION_CLEAR;// clear dst + break; + 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) + case wxEQUIV: // (NOT src) XOR dst + case wxINVERT: // NOT dst + case wxNAND: // (NOT src) OR (NOT dst) + case wxNOR: // (NOT src) AND (NOT dst) + case wxOR_INVERT: // (NOT src) OR dst + case wxOR_REVERSE: // src OR (NOT dst) + case wxSET: // 1 + case wxSRC_INVERT: // NOT src + default: + return false; + } + return true; +} + //----------------------------------------------------------------------------- // wxDC bridge class //----------------------------------------------------------------------------- @@ -135,7 +172,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 @@ -158,7 +203,7 @@ void wxGCDCImpl::Init() m_font = *wxNORMAL_FONT; m_brush = *wxWHITE_BRUSH; - m_graphicContext = NULL; + m_graphicContext = wxGraphicsContext::Create(); m_logicalFunctionSupported = true; } @@ -228,9 +273,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 ) @@ -456,14 +499,20 @@ void wxGCDCImpl::SetLogicalFunction( wxRasterOperationMode function ) return; m_logicalFunction = function; - if ( m_graphicContext->SetLogicalFunction( function ) ) - m_logicalFunctionSupported=true; + + wxCompositionMode mode; + m_logicalFunctionSupported = TranslateRasterOp( function, &mode); + if (m_logicalFunctionSupported) + m_logicalFunctionSupported = m_graphicContext->SetCompositionMode(mode); + + if ( function == wxXOR ) + m_graphicContext->SetAntialiasMode(wxANTIALIAS_NONE); else - m_logicalFunctionSupported=false; + 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; @@ -802,7 +851,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 ) { @@ -822,53 +871,71 @@ bool wxGCDCImpl::DoStretchBlit( if ( logical_func == wxNO_OP ) return true; - else if ( !m_graphicContext->SetLogicalFunction( logical_func ) ) + + wxCompositionMode mode; + if ( !TranslateRasterOp(logical_func, &mode) ) { - wxFAIL_MSG( wxT("Blitting is only supported with wxCOPY logical operation.") ); + wxFAIL_MSG( wxT("Blitting is not supported with this logical operation.") ); return false; } - if (xsrcMask == -1 && ysrcMask == -1) + bool retval = true; + + wxCompositionMode formerMode = m_graphicContext->GetCompositionMode(); + if (m_graphicContext->SetCompositionMode(mode)) { - xsrcMask = xsrc; - ysrcMask = ysrc; - } + wxAntialiasMode formerAa = m_graphicContext->GetAntialiasMode(); + if (mode == wxCOMPOSITION_XOR) + { + m_graphicContext->SetAntialiasMode(wxANTIALIAS_NONE); + } - wxRect subrect(source->LogicalToDeviceX(xsrc), - source->LogicalToDeviceY(ysrc), - source->LogicalToDeviceXRel(srcWidth), - source->LogicalToDeviceYRel(srcHeight)); + if (xsrcMask == -1 && ysrcMask == -1) + { + xsrcMask = xsrc; + ysrcMask = ysrc; + } - // if needed clip the subrect down to the size of the source DC - wxCoord sw, sh; - source->GetSize(&sw, &sh); - sw = source->LogicalToDeviceXRel(sw); - sh = source->LogicalToDeviceYRel(sh); - if (subrect.x + subrect.width > sw) - subrect.width = sw - subrect.x; - if (subrect.y + subrect.height > sh) - subrect.height = sh - subrect.y; + wxRect subrect(source->LogicalToDeviceX(xsrc), + source->LogicalToDeviceY(ysrc), + source->LogicalToDeviceXRel(srcWidth), + source->LogicalToDeviceYRel(srcHeight)); - wxBitmap blit = source->GetAsBitmap( &subrect ); + // if needed clip the subrect down to the size of the source DC + wxCoord sw, sh; + source->GetSize(&sw, &sh); + sw = source->LogicalToDeviceXRel(sw); + sh = source->LogicalToDeviceYRel(sh); + if (subrect.x + subrect.width > sw) + subrect.width = sw - subrect.x; + if (subrect.y + subrect.height > sh) + subrect.height = sh - subrect.y; - if ( blit.IsOk() ) - { - if ( !useMask && blit.GetMask() ) - blit.SetMask(NULL); + wxBitmap blit = source->GetAsBitmap( &subrect ); - m_graphicContext->DrawBitmap( blit, xdest, ydest, - dstWidth, dstHeight); - } - else - { - wxFAIL_MSG( wxT("Cannot Blit. Unable to get contents of DC as bitmap.") ); - return false; - } + if ( blit.IsOk() ) + { + if ( !useMask && blit.GetMask() ) + blit.SetMask(NULL); - // reset logical function - m_graphicContext->SetLogicalFunction( m_logicalFunction ); + m_graphicContext->DrawBitmap( blit, xdest, ydest, + dstWidth, dstHeight); + } + else + { + wxFAIL_MSG( wxT("Cannot Blit. Unable to get contents of DC as bitmap.") ); + retval = false; + } - return true; + if (mode == wxCOMPOSITION_XOR) + { + m_graphicContext->SetAntialiasMode(formerAa); + } + } + // reset composition + m_graphicContext->SetCompositionMode(formerMode); + + return retval; } void wxGCDCImpl::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, @@ -914,7 +981,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 ) { @@ -942,7 +1009,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() )