]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/graphics.cpp
use WPARAM (which is 64 bit under Win64) for timer ids instead of long (which is...
[wxWidgets.git] / src / msw / graphics.cpp
index 210f3e0f9f713455576e81d86409407a5d8eb8fa..93ee67ba1959a845488bc0537f3948743e43d99a 100644 (file)
 
 #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<wxGDIPlusBitmapData*>(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") );