return (deg * M_PI) / 180.0;
}
-static bool TranslateRasterOp(wxRasterOperationMode function, wxCompositionMode *op)
+static wxCompositionMode TranslateRasterOp(wxRasterOperationMode function)
{
switch ( function )
{
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;
+ return wxCOMPOSITION_OVER;
+
case wxOR: // src OR dst
- *op = wxCOMPOSITION_ADD;
- break;
+ return wxCOMPOSITION_ADD;
+
case wxNO_OP: // dst
- *op = wxCOMPOSITION_DEST; // ignore the source
- break;
+ return wxCOMPOSITION_DEST; // ignore the source
+
case wxCLEAR: // 0
- *op = wxCOMPOSITION_CLEAR;// clear dst
- break;
+ return wxCOMPOSITION_CLEAR;// clear dst
+
case wxXOR: // src XOR dst
- *op = wxCOMPOSITION_XOR;
- break;
+ return wxCOMPOSITION_XOR;
case wxAND: // src AND dst
case wxAND_INVERT: // (NOT src) AND dst
case wxOR_REVERSE: // src OR (NOT dst)
case wxSET: // 1
case wxSRC_INVERT: // NOT src
- default:
- return false;
+ break;
}
- return true;
+
+ return wxCOMPOSITION_INVALID;
}
//-----------------------------------------------------------------------------
}
#endif
+#if defined(__WXMSW__) && wxUSE_ENH_METAFILE
+wxGCDC::wxGCDC(const wxEnhMetaFileDC& dc)
+ : wxDC(new wxGCDCImpl(this, dc))
+{
+}
+#endif
+
wxGCDC::wxGCDC() :
wxDC( new wxGCDCImpl( this ) )
{
{
}
-wxGraphicsContext* wxGCDC::GetGraphicsContext()
+wxGraphicsContext* wxGCDC::GetGraphicsContext() const
{
if (!m_pimpl) return NULL;
wxGCDCImpl *gc_impl = (wxGCDCImpl*) m_pimpl;
}
#endif
+#if defined(__WXMSW__) && wxUSE_ENH_METAFILE
+wxGCDCImpl::wxGCDCImpl(wxDC *owner, const wxEnhMetaFileDC& dc)
+ : wxDCImpl(owner)
+{
+ Init();
+ SetGraphicsContext(wxGraphicsContext::Create(dc));
+}
+#endif
+
void wxGCDCImpl::Init()
{
m_ok = false;
m_logicalFunction = function;
- wxCompositionMode mode;
- m_logicalFunctionSupported = TranslateRasterOp( function, &mode);
+ wxCompositionMode mode = TranslateRasterOp( function );
+ m_logicalFunctionSupported = mode != wxCOMPOSITION_INVALID;
if (m_logicalFunctionSupported)
m_logicalFunctionSupported = m_graphicContext->SetCompositionMode(mode);
if ( logical_func == wxNO_OP )
return true;
- wxCompositionMode mode;
- if ( !TranslateRasterOp(logical_func, &mode) )
+ wxCompositionMode mode = TranslateRasterOp(logical_func);
+ if ( mode == wxCOMPOSITION_INVALID )
{
wxFAIL_MSG( wxT("Blitting is not supported with this logical operation.") );
return false;
void wxGCDCImpl::DoDrawText(const wxString& str, wxCoord x, wxCoord y)
{
+ // For compatibility with other ports (notably wxGTK) and because it's
+ // genuinely useful, we allow passing multiline strings to DrawText().
+ // However there is no native OSX function to draw them directly so we
+ // instead reuse the generic DrawLabel() method to render them. Of course,
+ // DrawLabel() itself will call back to us but with single line strings
+ // only so there won't be any infinite recursion here.
+ if ( str.find('\n') != wxString::npos )
+ {
+ GetOwner()->DrawLabel(str, wxRect(x, y, 0, 0));
+ return;
+ }
+
wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoDrawText - invalid DC") );
if ( str.empty() )
wxDCImpl::DoDrawCheckMark(x,y,width,height);
}
+#ifdef __WXMSW__
+wxRect wxGCDCImpl::MSWApplyGDIPlusTransform(const wxRect& r) const
+{
+ wxGraphicsContext* const gc = GetGraphicsContext();
+ wxCHECK_MSG( gc, r, wxT("Invalid wxGCDC") );
+
+ double x = 0,
+ y = 0;
+ gc->GetTransform().TransformPoint(&x, &y);
+
+ wxRect rect(r);
+ rect.Offset(x, y);
+
+ return rect;
+}
+#endif // __WXMSW__
+
#endif // wxUSE_GRAPHICS_CONTEXT