X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/091111d693989a6be93685726db948cccb203347..491acfc75e9bf12806e177b655f3fb7df53e7602:/src/msw/graphics.cpp diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index 210f3e0f9f..93ee67ba19 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -11,12 +11,12 @@ #include "wx/wxprec.h" -#include "wx/dc.h" - #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#include "wx/dc.h" + #if wxUSE_GRAPHICS_CONTEXT #ifndef WX_PRECOMP @@ -145,7 +145,7 @@ public : // gets the bounding box enclosing all points (possibly including control points) virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const; - virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE) const; + virtual bool Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) const; private : GraphicsPath* m_path; @@ -296,14 +296,22 @@ public: virtual void * GetNativeContext(); virtual void StrokePath( const wxGraphicsPath& p ); - virtual void FillPath( const wxGraphicsPath& p , int fillStyle = wxODDEVEN_RULE ); + virtual void FillPath( const wxGraphicsPath& p , wxPolygonFillMode fillStyle = wxODDEVEN_RULE ); // stroke lines connecting each of the points virtual void StrokeLines( size_t n, const wxPoint2DDouble *points); // draws a polygon - virtual void DrawLines( size_t n, const wxPoint2DDouble *points, int fillStyle = wxODDEVEN_RULE ); + virtual void DrawLines( size_t n, const wxPoint2DDouble *points, wxPolygonFillMode fillStyle = wxODDEVEN_RULE ); + + virtual bool SetAntialiasMode(wxAntialiasMode antialias); + virtual bool SetCompositionMode(wxCompositionMode op); + + virtual void BeginLayer(wxDouble opacity); + + virtual void EndLayer(); + virtual void Translate( wxDouble dx , wxDouble dy ); virtual void Scale( wxDouble xScale , wxDouble yScale ); virtual void Rotate( wxDouble angle ); @@ -349,7 +357,7 @@ private: DECLARE_DYNAMIC_CLASS_NO_COPY(wxGDIPlusContext) }; -class WXDLLIMPEXP_CORE wxGDIPlusMeasuringContext : public wxGDIPlusContext +class wxGDIPlusMeasuringContext : public wxGDIPlusContext { public: wxGDIPlusMeasuringContext( wxGraphicsRenderer* renderer ) : wxGDIPlusContext( renderer , m_hdc = GetDC(NULL), 1000, 1000 ) @@ -878,7 +886,7 @@ void wxGDIPlusPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble * *h = bounds.Height; } -bool wxGDIPlusPathData::Contains( wxDouble x, wxDouble y, int fillStyle ) const +bool wxGDIPlusPathData::Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle ) const { m_path->SetFillMode( fillStyle == wxODDEVEN_RULE ? FillModeAlternate : FillModeWinding); return m_path->IsVisible( (FLOAT) x,(FLOAT) y) == TRUE ; @@ -1110,6 +1118,9 @@ void wxGDIPlusContext::ResetClip() void wxGDIPlusContext::StrokeLines( size_t n, const wxPoint2DDouble *points) { + if (m_composition == wxCOMPOSITION_DEST) + return; + if ( !m_pen.IsNull() ) { wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() ); @@ -1125,8 +1136,11 @@ void wxGDIPlusContext::StrokeLines( size_t n, const wxPoint2DDouble *points) } } -void wxGDIPlusContext::DrawLines( size_t n, const wxPoint2DDouble *points, int WXUNUSED(fillStyle) ) +void wxGDIPlusContext::DrawLines( size_t n, const wxPoint2DDouble *points, wxPolygonFillMode WXUNUSED(fillStyle) ) { + if (m_composition == wxCOMPOSITION_DEST) + return; + wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() ); Point *cpoints = new Point[n]; for (size_t i = 0; i < n; i++) @@ -1144,6 +1158,9 @@ void wxGDIPlusContext::DrawLines( size_t n, const wxPoint2DDouble *points, int W void wxGDIPlusContext::StrokePath( const wxGraphicsPath& path ) { + if (m_composition == wxCOMPOSITION_DEST) + return; + if ( !m_pen.IsNull() ) { wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() ); @@ -1151,8 +1168,11 @@ void wxGDIPlusContext::StrokePath( const wxGraphicsPath& path ) } } -void wxGDIPlusContext::FillPath( const wxGraphicsPath& path , int fillStyle ) +void wxGDIPlusContext::FillPath( const wxGraphicsPath& path , wxPolygonFillMode fillStyle ) { + if (m_composition == wxCOMPOSITION_DEST) + return; + if ( !m_brush.IsNull() ) { wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() ); @@ -1162,6 +1182,66 @@ void wxGDIPlusContext::FillPath( const wxGraphicsPath& path , int fillStyle ) } } +bool wxGDIPlusContext::SetAntialiasMode(wxAntialiasMode antialias) +{ + if (m_antialias == antialias) + return true; + + m_antialias = antialias; + + SmoothingMode antialiasMode; + switch (antialias) + { + case wxANTIALIAS_DEFAULT: + antialiasMode = SmoothingModeHighQuality; + break; + case wxANTIALIAS_NONE: + antialiasMode = SmoothingModeNone; + break; + default: + return false; + } + m_context->SetSmoothingMode(antialiasMode); + return true; +} + +bool wxGDIPlusContext::SetCompositionMode(wxCompositionMode op) +{ + if ( m_composition == op ) + return true; + + m_composition = op; + + if (m_composition == wxCOMPOSITION_DEST) + return true; + + CompositingMode cop; + switch (op) + { + case wxCOMPOSITION_SOURCE: + cop = CompositingModeSourceCopy; + break; + case wxCOMPOSITION_OVER: + cop = CompositingModeSourceOver; + break; + default: + return false; + } + + m_context->SetCompositingMode(cop); + return true; +} + +void wxGDIPlusContext::BeginLayer(wxDouble /* opacity */) +{ + // TODO +} + +void wxGDIPlusContext::EndLayer() +{ + // TODO +} + void wxGDIPlusContext::Rotate( wxDouble angle ) { m_context->RotateTransform( RadToDeg(angle) ); @@ -1192,6 +1272,9 @@ void wxGDIPlusContext::PopState() void wxGDIPlusContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) { + if (m_composition == wxCOMPOSITION_DEST) + return; + Bitmap* image = static_cast(bmp.GetRefData())->GetGDIPlusBitmap(); if ( image ) { @@ -1215,6 +1298,9 @@ void wxGDIPlusContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, void wxGDIPlusContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) { + if (m_composition == wxCOMPOSITION_DEST) + return; + // the built-in conversion fails when there is alpha in the HICON (eg XP style icons), we can only // find out by looking at the bitmap data whether there really was alpha in it HICON hIcon = (HICON)icon.GetHICON(); @@ -1278,6 +1364,9 @@ void wxGDIPlusContext::DoDrawFilledText(const wxString& str, wxDouble x, wxDouble y, const wxGraphicsBrush& brush) { + if (m_composition == wxCOMPOSITION_DEST) + return; + wxCHECK_RET( !m_font.IsNull(), wxT("wxGDIPlusContext::DrawText - no valid font set") );