X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89efaf2b6595e59af618556d7e79492cab50c73c..c753eb9269d1e6c99b80a2d782ce49d9864ac1da:/src/common/dcgraph.cpp diff --git a/src/common/dcgraph.cpp b/src/common/dcgraph.cpp index 4a713993a8..481f256d2a 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 //----------------------------------------------------------------------------- @@ -413,6 +450,12 @@ 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 } } @@ -456,10 +499,16 @@ 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 (mode == wxCOMPOSITION_XOR) + m_graphicContext->SetAntialiasMode(wxANTIALIAS_NONE); else - m_logicalFunctionSupported=false; + m_graphicContext->SetAntialiasMode(wxANTIALIAS_DEFAULT); } bool wxGCDCImpl::DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), @@ -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); + } + + if (xsrcMask == -1 && ysrcMask == -1) + { + xsrcMask = xsrc; + ysrcMask = ysrc; + } - wxRect subrect(source->LogicalToDeviceX(xsrc), - source->LogicalToDeviceY(ysrc), - source->LogicalToDeviceXRel(srcWidth), - source->LogicalToDeviceYRel(srcHeight)); + wxRect subrect(source->LogicalToDeviceX(xsrc), + source->LogicalToDeviceY(ysrc), + source->LogicalToDeviceXRel(srcWidth), + source->LogicalToDeviceYRel(srcHeight)); - // 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 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; - wxBitmap blit = source->GetAsBitmap( &subrect ); + wxBitmap blit = source->GetAsBitmap( &subrect ); - if ( blit.IsOk() ) - { - if ( !useMask && blit.GetMask() ) - blit.SetMask(NULL); + if ( blit.IsOk() ) + { + if ( !useMask && blit.GetMask() ) + blit.SetMask(NULL); - m_graphicContext->DrawBitmap( blit, xdest, ydest, - dstWidth, dstHeight); - } - else - { - wxFAIL_MSG( wxT("Cannot Blit. Unable to get contents of DC as bitmap.") ); - return false; + m_graphicContext->DrawBitmap( blit, xdest, ydest, + dstWidth, dstHeight); + } + else + { + wxFAIL_MSG( wxT("Cannot Blit. Unable to get contents of DC as bitmap.") ); + retval = false; + } + + if (mode == wxCOMPOSITION_XOR) + { + m_graphicContext->SetAntialiasMode(formerAa); + } } + // reset composition + m_graphicContext->SetCompositionMode(formerMode); - // reset logical function - m_graphicContext->SetLogicalFunction( m_logicalFunction ); - - return true; + return retval; } void wxGCDCImpl::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,