1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     Wrapper definitions for wx.GraphicsPath, wx.GraphicsContext
 
   9 // Copyright:   (c) 2006 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  16 //---------------------------------------------------------------------------
 
  20 #include <wx/graphics.h>
 
  23 // Turn off the aquisition of the Global Interpreter Lock for the classes and
 
  24 // functions in this file
 
  28 //---------------------------------------------------------------------------
 
  29 //---------------------------------------------------------------------------
 
  32 #if !wxUSE_GRAPHICS_CONTEXT
 
  33 // C++ stub classes for platforms or build configurations that don't have
 
  34 // wxGraphicsContext yet.
 
  36 class wxGraphicsRenderer;
 
  37 class wxGraphicsMatrix;
 
  40 class wxGraphicsObject : public wxObject
 
  44     wxGraphicsObject( wxGraphicsRenderer*  ) {
 
  45         PyErr_SetString(PyExc_NotImplementedError,
 
  46                         "wx.GraphicsObject is not available on this platform.");
 
  48     wxGraphicsObject( const wxGraphicsObject&  ) {}
 
  49     virtual ~wxGraphicsObject() {}
 
  50     bool IsNull() const { return false; }
 
  51     wxGraphicsRenderer* GetRenderer() const { return NULL; }
 
  56 class wxGraphicsPen : public wxGraphicsObject
 
  60     virtual ~wxGraphicsPen() {}
 
  62 wxGraphicsPen wxNullGraphicsPen;
 
  66 class wxGraphicsBrush : public wxGraphicsObject
 
  70     virtual ~wxGraphicsBrush() {}
 
  72 wxGraphicsBrush wxNullGraphicsBrush;
 
  76 class wxGraphicsFont : public wxGraphicsObject
 
  80     virtual ~wxGraphicsFont() {}
 
  82 wxGraphicsFont wxNullGraphicsFont;
 
  86 class wxGraphicsPath : public wxGraphicsObject
 
  90     wxGraphicsPath(wxGraphicsRenderer* ) {
 
  91         PyErr_SetString(PyExc_NotImplementedError,
 
  92                         "wx.GraphicsPath is not available on this platform.");
 
  94     virtual ~wxGraphicsPath() {}
 
  96     void MoveToPoint( wxDouble, wxDouble ) {}
 
  97     void MoveToPoint( const wxPoint2DDouble& ) {}
 
  98     void AddLineToPoint( wxDouble, wxDouble ) {}
 
  99     void AddLineToPoint( const wxPoint2DDouble& ) {}
 
 100     void AddCurveToPoint( wxDouble, wxDouble, wxDouble, wxDouble, wxDouble, wxDouble ) {}
 
 101     void AddCurveToPoint( const wxPoint2DDouble&, const wxPoint2DDouble&, const wxPoint2DDouble&) {}
 
 102     void AddPath( const wxGraphicsPath& ) {}
 
 103     void CloseSubpath() {}
 
 104     void GetCurrentPoint( wxDouble&, wxDouble&) const {}
 
 105     wxPoint2DDouble GetCurrentPoint() const { return wxPoint2D(0,0); }
 
 106     void AddArc( wxDouble, wxDouble, wxDouble, wxDouble, wxDouble, bool ) {}
 
 107     void AddArc( const wxPoint2DDouble& , wxDouble, wxDouble , wxDouble , bool ) {}
 
 109     void AddQuadCurveToPoint( wxDouble, wxDouble, wxDouble, wxDouble ) {}
 
 110     void AddRectangle( wxDouble, wxDouble, wxDouble, wxDouble ) {}
 
 111     void AddCircle( wxDouble, wxDouble, wxDouble ) {}
 
 112     void AddArcToPoint( wxDouble, wxDouble , wxDouble, wxDouble, wxDouble )  {}
 
 114     void AddEllipse( wxDouble , wxDouble , wxDouble , wxDouble ) {}
 
 115     void AddRoundedRectangle( wxDouble , wxDouble , wxDouble , wxDouble , wxDouble ) {}
 
 116     void * GetNativePath() const { return NULL; }
 
 117     void UnGetNativePath(void *) const {}
 
 118     void Transform( const wxGraphicsMatrix& ) {}
 
 119     void GetBox(wxDouble *, wxDouble *, wxDouble *, wxDouble *) const {}
 
 120     wxRect2D GetBox() const { return wxRect2D(0,0,0,0); }
 
 122     bool Contains( wxDouble , wxDouble , int ) const { return false; }
 
 123     bool Contains( const wxPoint2DDouble& , int ) const { return false; }
 
 125 wxGraphicsPath wxNullGraphicsPath;
 
 128 class wxGraphicsMatrix : public wxGraphicsObject
 
 131     wxGraphicsMatrix() { }
 
 132     wxGraphicsMatrix(wxGraphicsRenderer* ) {
 
 133         PyErr_SetString(PyExc_NotImplementedError,
 
 134                         "wx.GraphicsMatrix is not available on this platform.");
 
 136     virtual ~wxGraphicsMatrix() {}
 
 137     virtual void Concat( const wxGraphicsMatrix & ) {}
 
 138     virtual void Copy( const wxGraphicsMatrix & )  {}
 
 139     virtual void Set(wxDouble , wxDouble , wxDouble , wxDouble ,
 
 140                      wxDouble , wxDouble ) {}
 
 141     virtual void Get(wxDouble*, wxDouble*, wxDouble*,
 
 142                      wxDouble*, wxDouble*, wxDouble*) {}
 
 143     virtual void Invert() {}
 
 144     virtual bool IsEqual( const wxGraphicsMatrix& t) const  { return false; }
 
 145     virtual bool IsIdentity() const { return false; }
 
 146     virtual void Translate( wxDouble , wxDouble ) {}
 
 147     virtual void Scale( wxDouble , wxDouble  ) {}
 
 148     virtual void Rotate( wxDouble  ) {}
 
 149     virtual void TransformPoint( wxDouble *, wxDouble * ) const {}
 
 150     virtual void TransformDistance( wxDouble *, wxDouble * ) const {}
 
 151     virtual void * GetNativeMatrix() const { return NULL; }
 
 153 wxGraphicsMatrix wxNullGraphicsMatrix;
 
 156 class wxGraphicsContext : public wxGraphicsObject
 
 160     wxGraphicsContext(wxGraphicsRenderer* ) {
 
 161         PyErr_SetString(PyExc_NotImplementedError,
 
 162                         "wx.GraphicsContext is not available on this platform.");
 
 165     virtual ~wxGraphicsContext() {}
 
 167     static wxGraphicsContext* Create()   {
 
 168         PyErr_SetString(PyExc_NotImplementedError,
 
 169                         "wx.GraphicsContext is not available on this platform.");
 
 172     static wxGraphicsContext* Create( const wxWindowDC& )  {
 
 173         PyErr_SetString(PyExc_NotImplementedError,
 
 174                         "wx.GraphicsContext is not available on this platform.");
 
 178     static wxGraphicsContext* CreateFromNative( void *  )  {
 
 179         PyErr_SetString(PyExc_NotImplementedError,
 
 180                         "wx.GraphicsContext is not available on this platform.");
 
 184     static wxGraphicsContext* CreateFromNativeWindow( void *  )  {
 
 185         PyErr_SetString(PyExc_NotImplementedError,
 
 186                         "wx.GraphicsContext is not available on this platform.");
 
 190     static wxGraphicsContext* Create( wxWindow*  )  {
 
 191         PyErr_SetString(PyExc_NotImplementedError,
 
 192                         "wx.GraphicsContext is not available on this platform.");
 
 196     wxGraphicsPath CreatePath()  { return wxNullGraphicsPath; }
 
 198     virtual wxGraphicsPen CreatePen(const wxPen& )  { return wxNullGraphicsPen; }
 
 200     virtual wxGraphicsBrush CreateBrush(const wxBrush& ) { return wxNullGraphicsBrush; }
 
 202     virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble , wxDouble , wxDouble , wxDouble ,
 
 203                                                         const wxColour&, const wxColour&) { return wxNullGraphicsBrush; }
 
 205     virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo,
 
 206                                                         wxDouble xc, wxDouble yc, wxDouble radius,
 
 207                                                         const wxColour &oColor, const wxColour &cColor) { return wxNullGraphicsBrush; }
 
 209     virtual wxGraphicsFont CreateFont( const wxFont &, const wxColour & )  { return wxNullGraphicsFont; }
 
 211     virtual wxGraphicsMatrix CreateMatrix( wxDouble, wxDouble, wxDouble, wxDouble,
 
 212                                             wxDouble, wxDouble)  { return wxNullGraphicsMatrix; }
 
 214     virtual void PushState() {}
 
 215     virtual void PopState() {}
 
 216     virtual void Clip( const wxRegion & ) {}
 
 217     virtual void Clip( wxDouble , wxDouble , wxDouble , wxDouble  ) {}
 
 218     virtual void ResetClip() {}
 
 219     virtual void * GetNativeContext() { return NULL; }
 
 220     virtual int GetLogicalFunction() const { return 0; }
 
 221     virtual bool SetLogicalFunction(int ) {}    
 
 222     virtual void Translate( wxDouble , wxDouble ) {}
 
 223     virtual void Scale( wxDouble , wxDouble ) {}
 
 224     virtual void Rotate( wxDouble ) {}
 
 225     virtual void ConcatTransform( const wxGraphicsMatrix& ) {}
 
 226     virtual void SetTransform( const wxGraphicsMatrix& ) {}
 
 227     virtual wxGraphicsMatrix GetTransform() const { return wxNullGraphicsMatrix; }
 
 229     virtual void SetPen( const wxGraphicsPen& ) {}
 
 230     void SetPen( const wxPen& ) {}
 
 232     virtual void SetBrush( const wxGraphicsBrush& ) {}
 
 233     void SetBrush( const wxBrush& ) {}
 
 235     virtual void SetFont( const wxGraphicsFont& ) {}
 
 236     void SetFont( const wxFont&, const wxColour& ) {}
 
 238     virtual void StrokePath( const wxGraphicsPath & ) {}
 
 239     virtual void FillPath( const wxGraphicsPath &, int ) {}
 
 240     virtual void DrawPath( const wxGraphicsPath &, int ) {}
 
 242     virtual void DrawText( const wxString &, wxDouble , wxDouble  )  {}
 
 243     virtual void DrawText( const wxString &, wxDouble , wxDouble , wxDouble ) {}
 
 244     virtual void DrawText( const wxString &, wxDouble , wxDouble , wxGraphicsBrush )  {}
 
 245     virtual void DrawText( const wxString &, wxDouble , wxDouble , wxDouble , wxGraphicsBrush ) {}
 
 246     virtual void GetTextExtent( const wxString &, wxDouble *, wxDouble *,
 
 247                                 wxDouble *, wxDouble * ) const {}
 
 248     virtual void GetPartialTextExtents(const wxString& , wxArrayDouble& ) const  {}
 
 250     virtual void DrawBitmap( const wxBitmap &, wxDouble , wxDouble , wxDouble , wxDouble  )  {}
 
 251     virtual void DrawIcon( const wxIcon &, wxDouble , wxDouble , wxDouble , wxDouble  )  {}
 
 253     virtual void StrokeLine( wxDouble , wxDouble , wxDouble , wxDouble ) {}
 
 254     virtual void StrokeLines( size_t , const wxPoint2DDouble *) {}
 
 255     virtual void StrokeLines( size_t , const wxPoint2DDouble *, const wxPoint2DDouble *) {}
 
 256     virtual void DrawLines( size_t , const wxPoint2DDouble *, int ) {}
 
 257     virtual void DrawRectangle( wxDouble , wxDouble , wxDouble , wxDouble ) {}
 
 258     virtual void DrawEllipse( wxDouble , wxDouble , wxDouble , wxDouble ) {}
 
 259     virtual void DrawRoundedRectangle( wxDouble , wxDouble , wxDouble , wxDouble , wxDouble ) {}
 
 260     virtual bool ShouldOffset() const { return false; }
 
 264 class wxGraphicsRenderer : public wxObject
 
 267     wxGraphicsRenderer() {
 
 268         PyErr_SetString(PyExc_NotImplementedError,
 
 269                         "wx.GraphicsRenderer is not available on this platform.");
 
 272     virtual ~wxGraphicsRenderer() {}
 
 274     static wxGraphicsRenderer* GetDefaultRenderer() {
 
 275         PyErr_SetString(PyExc_NotImplementedError,
 
 276                         "wx.GraphicsRenderer is not available on this platform.");
 
 280     virtual wxGraphicsContext * CreateContext( const wxWindowDC& ) { return NULL; }
 
 281     virtual wxGraphicsContext * CreateContextFromNativeContext( void *  ) { return NULL; }
 
 282     virtual wxGraphicsContext * CreateContextFromNativeWindow( void *  )  { return NULL; }
 
 283     virtual wxGraphicsContext * CreateContext( wxWindow*  ) { return NULL; }
 
 284     virtual wxGraphicsContext * CreateMeasuringContext() { return NULL; }
 
 286     virtual wxGraphicsPath CreatePath()  { return wxNullGraphicsPath; }
 
 288     virtual wxGraphicsMatrix CreateMatrix( wxDouble , wxDouble , wxDouble , wxDouble ,
 
 289                                              wxDouble , wxDouble ) { return wxNullGraphicsMatrix; }
 
 291     virtual wxGraphicsPen CreatePen(const wxPen& )  { return wxNullGraphicsPen; }
 
 292     virtual wxGraphicsBrush CreateBrush(const wxBrush&  )  { return wxNullGraphicsBrush; }
 
 293     virtual wxGraphicsBrush CreateLinearGradientBrush(wxDouble , wxDouble , wxDouble , wxDouble ,
 
 294                                                       const wxColour&, const wxColour&)  { return wxNullGraphicsBrush; }
 
 295     virtual wxGraphicsBrush CreateRadialGradientBrush(wxDouble , wxDouble , wxDouble , wxDouble , wxDouble ,
 
 296                                                       const wxColour &, const wxColour &)  { return wxNullGraphicsBrush; }
 
 297     virtual wxGraphicsFont CreateFont( const wxFont & , const wxColour & ) { return wxNullGraphicsFont; }
 
 302 class wxGCDC: public wxWindowDC
 
 305     wxGCDC(const wxWindowDC&) {
 
 306         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 307         PyErr_SetString(PyExc_NotImplementedError,
 
 308                         "wxGCDC is not available on this platform.");
 
 309         wxPyEndBlockThreads(blocked);
 
 312     wxGCDC(const wxWindow*) {
 
 313         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 314         PyErr_SetString(PyExc_NotImplementedError,
 
 315                         "wxGCDC is not available on this platform.");
 
 316         wxPyEndBlockThreads(blocked);
 
 320         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 321         PyErr_SetString(PyExc_NotImplementedError,
 
 322                         "wxGCDC is not available on this platform.");
 
 323         wxPyEndBlockThreads(blocked);
 
 328     wxGraphicsContext* GetGraphicsContext() { return NULL; }
 
 329     void SetGraphicsContext( wxGraphicsContext* ) {}
 
 335 //---------------------------------------------------------------------------
 
 336 //---------------------------------------------------------------------------
 
 339 %typemap(in) (size_t points, wxPoint2D* points_array ) {
 
 340     $2 = wxPoint2D_LIST_helper($input, &$1);
 
 341     if ($2 == NULL) SWIG_fail;
 
 343 %typemap(freearg) (size_t points, wxPoint2D* points_array ) {
 
 344     if ($2) delete [] $2;
 
 349 MustHaveApp(wxGraphicsPath);
 
 350 MustHaveApp(wxGraphicsContext);
 
 353 typedef double wxDouble;
 
 356 //---------------------------------------------------------------------------
 
 359 DocStr(wxGraphicsObject,
 
 360 "This class is the superclass of native graphics objects like pens
 
 361 etc. It provides the internal reference counting.  It is not to be
 
 362 instantiated by user code.", "");
 
 363 class wxGraphicsObject : public wxObject
 
 366     wxGraphicsObject( wxGraphicsRenderer* renderer = NULL );
 
 367     virtual ~wxGraphicsObject();
 
 370         bool , IsNull() const ,
 
 371         "Is this object valid (false) or still empty (true)?", "");
 
 374         wxGraphicsRenderer* , GetRenderer() const,
 
 375         "Returns the renderer that was used to create this instance, or
 
 376 ``None`` if it has not been initialized yet.", "");
 
 381 DocStr(wxGraphicsPen,
 
 382 "A wx.GraphicsPen is a native representation of a pen. It is used for
 
 383 stroking a path on a `wx.GraphicsContext`. The contents are specific and
 
 384 private to the respective renderer. The only way to get a valid instance
 
 385 is via a CreatePen call on the graphics context or the renderer
 
 387 class wxGraphicsPen : public wxGraphicsObject
 
 391     virtual ~wxGraphicsPen();
 
 394 DocStr(wxGraphicsBrush,
 
 395 "A wx.GraphicsBrush is a native representation of a brush. It is used
 
 396 for filling a path on a `wx.GraphicsContext`. The contents are
 
 397 specific and private to the respective renderer. The only way to get a
 
 398 valid instance is via a Create...Brush call on the graphics context or
 
 399 the renderer instance.", "");
 
 400 class wxGraphicsBrush : public wxGraphicsObject
 
 404     virtual ~wxGraphicsBrush();
 
 408 DocStr(wxGraphicsFont,
 
 409 "A `wx.GraphicsFont` is a native representation of a font (including
 
 410 text colour). The contents are specific an private to the respective
 
 411 renderer.  The only way to get a valid instance is via a CreateFont
 
 412 call on the graphics context or the renderer instance.", "");
 
 413 class wxGraphicsFont : public wxGraphicsObject
 
 417     virtual ~wxGraphicsFont();
 
 421 //---------------------------------------------------------------------------
 
 423 DocStr(wxGraphicsMatrix,
 
 424 "A wx.GraphicsMatrix is a native representation of an affine
 
 425 matrix. The contents are specific and private to the respective
 
 426 renderer. The only way to get a valid instance is via a CreateMatrix
 
 427 call on the graphics context or the renderer instance.", "");
 
 428 class wxGraphicsMatrix : public wxGraphicsObject
 
 431 //    wxGraphicsMatrix(); 
 
 432     virtual ~wxGraphicsMatrix();
 
 435         virtual void , Concat( const wxGraphicsMatrix& t ),
 
 436         "Concatenates the passed in matrix to the current matrix.", "");
 
 440         virtual void , Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
 
 441                            wxDouble tx=0.0, wxDouble ty=0.0),
 
 442         "Sets the matrix to the specified values (default values are the
 
 443 identity matrix.)", "");
 
 447         virtual void , Get(wxDouble* OUTPUT, wxDouble* OUTPUT, wxDouble* OUTPUT,
 
 448                            wxDouble* OUTPUT, wxDouble* OUTPUT, wxDouble* OUTPUT),
 
 449         "Get(self) --> (a, b, c, d, tx, ty)",
 
 450         "Gets the component values of the matrix and returns them as a tuple.", "");
 
 454         virtual void , Invert(),
 
 455         "Inverts the matrix.", "");
 
 459         virtual bool , IsEqual( const wxGraphicsMatrix& t) const,
 
 460         "Returns ``True`` if the elements of the transformation matrix are
 
 465         virtual bool , IsIdentity() const,
 
 466         "Returns ``True`` if this is the identity matrix", "");
 
 470         virtual void , Translate( wxDouble dx , wxDouble dy ),
 
 471         "Add a translation to this matrix.", "");
 
 475         virtual void , Scale( wxDouble xScale , wxDouble yScale ),
 
 476         "Scales this matrix.", "");
 
 480         virtual void , Rotate( wxDouble angle ),
 
 481         "Rotates this matrix.  The angle should be specified in radians.", "");
 
 485         virtual void , TransformPoint( wxDouble *INOUT, wxDouble *INOUT ) const,
 
 486         "TransformPoint(self, x, y) --> (x, y)",
 
 487         "Applies this matrix to a point, returns the resulting point values", "");
 
 491         virtual void , TransformDistance( wxDouble *INOUT, wxDouble *INOUT ) const,
 
 492         "TransformDistance(self, dx, dy) --> (dx, dy)",
 
 493         "Applies this matrix to a distance (ie. performs all transforms except
 
 498         virtual void * , GetNativeMatrix() const,
 
 499         "Returns the native representation of the matrix. For CoreGraphics this
 
 500 is a CFAffineMatrix pointer. For GDIPlus a Matrix Pointer and for
 
 501 Cairo a cairo_matrix_t pointer.  NOTE: For wxPython we still need a
 
 502 way to make this value usable.", "");
 
 505 //---------------------------------------------------------------------------
 
 507 class wxGraphicsPath : public wxGraphicsObject
 
 511     virtual ~wxGraphicsPath();
 
 514     %nokwargs MoveToPoint;
 
 516            "Begins a new subpath at the specified point.", "");
 
 517     virtual void  MoveToPoint( wxDouble x, wxDouble y );
 
 518     void MoveToPoint( const wxPoint2D& p);
 
 521     %nokwargs AddLineToPoint;
 
 522     DocStr(AddLineToPoint,
 
 523         "Adds a straight line from the current point to the specified point.", "");
 
 524     virtual void AddLineToPoint( wxDouble x, wxDouble y );
 
 525     void AddLineToPoint( const wxPoint2D& p);
 
 528     %nokwargs AddCurveToPoint;
 
 529     DocStr(AddCurveToPoint,
 
 530         "Adds a cubic Bezier curve from the current point, using two control
 
 531 points and an end point", "");
 
 532     virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1,
 
 533                                   wxDouble cx2, wxDouble cy2,
 
 534                                   wxDouble x, wxDouble y );
 
 535     void AddCurveToPoint( const wxPoint2D& c1, const wxPoint2D& c2, const wxPoint2D& e);
 
 540         virtual void , AddPath( const wxGraphicsPath& path ),
 
 541         "Adds another path", "");
 
 545         virtual void , CloseSubpath(),
 
 546         "Closes the current sub-path.", "");
 
 550         wxPoint2D , GetCurrentPoint() const,
 
 551         "Gets the last point of the current path, (0,0) if not yet set", "");
 
 556         "Adds an arc of a circle centering at (x,y) with radius (r) from
 
 557 startAngle to endAngle", "");
 
 558     virtual void AddArc( wxDouble x, wxDouble y, wxDouble r,
 
 559                          wxDouble startAngle, wxDouble endAngle, bool clockwise=true );
 
 560     void AddArc( const wxPoint2D& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise=true);
 
 564         virtual void , AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ),
 
 565         "Adds a quadratic Bezier curve from the current point, using a control
 
 566 point and an end point", "");
 
 570         virtual void , AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ),
 
 571         "Appends a rectangle as a new closed subpath.", "");
 
 575         virtual void , AddCircle( wxDouble x, wxDouble y, wxDouble r ),
 
 576         "Appends a circle around (x,y) with radius r as a new closed subpath.", "");
 
 580         virtual void , AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ,
 
 581         "Appends an arc to two tangents connecting (current) to (x1,y1) and
 
 582 (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1)", "");
 
 586         virtual void , AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h),
 
 587         "Appends an ellipse fitting into the passed in rectangle.", "");
 
 591         virtual void , AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius),
 
 592         "Appends a rounded rectangle.", "");
 
 596         virtual void * , GetNativePath() const,
 
 597         "Returns the native path (CGPathRef for Core Graphics, Path pointer for
 
 598 GDIPlus and a cairo_path_t pointer for cairo).  NOTE: For wxPython we
 
 599 still need a way to make this value usable.", "");
 
 603         virtual void , UnGetNativePath(void *p) const,
 
 604         "Gives back the native path returned by GetNativePath() because there
 
 605 might be some deallocations necessary (eg on cairo the native path
 
 606 returned by GetNativePath is newly allocated each time).", "");
 
 610         virtual void , Transform( const wxGraphicsMatrix& matrix ),
 
 611         "Transforms each point of this path by the matrix", "");
 
 615         wxRect2D , GetBox() const,
 
 616         "Gets the bounding box enclosing all points (possibly including control
 
 622         "Returns ``True`` if the point is within the path.", "");
 
 623     virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE) const;
 
 624     bool Contains( const wxPoint2D& c, int fillStyle = wxODDEVEN_RULE) const;
 
 629 //---------------------------------------------------------------------------
 
 632 const wxGraphicsPen     wxNullGraphicsPen;
 
 633 const wxGraphicsBrush   wxNullGraphicsBrush;
 
 634 const wxGraphicsFont    wxNullGraphicsFont;
 
 635 const wxGraphicsMatrix  wxNullGraphicsMatrix;
 
 636 const wxGraphicsPath    wxNullGraphicsPath;
 
 639 //---------------------------------------------------------------------------
 
 641 DocStr(wxGraphicsContext,
 
 642 "A `wx.GraphicsContext` instance is the object that is drawn upon. It is
 
 643 created by a renderer using the CreateContext calls, this can be done
 
 644 either directly using a renderer instance, or indirectly using the
 
 645 static convenience CreateXXX functions of wx.GraphicsContext that
 
 646 always delegate the task to the default renderer.", "");
 
 648 class wxGraphicsContext : public wxGraphicsObject
 
 651     //wxGraphicsContext();         This is an ABC, use Create to make an instance...
 
 652     virtual ~wxGraphicsContext();
 
 657         "val.__dc = args[0] # save a ref so the dc will not be deleted before self";
 
 659            "Creates a wx.GraphicsContext either from a window or a DC.", "");
 
 660     static wxGraphicsContext* Create( const wxWindowDC& dc);
 
 661     static wxGraphicsContext* Create( wxWindow* window ) ;
 
 664         static wxGraphicsContext* , Create(),
 
 665         "Create a lightwieght context that can be used for measuring text only.", "",
 
 666         CreateMeasuringContext);
 
 668     %newobject CreateFromNative;
 
 670         static wxGraphicsContext* , CreateFromNative( void * context ) ,
 
 671         "Creates a wx.GraphicsContext from a native context. This native
 
 672 context must be eg a CGContextRef for Core Graphics, a Graphics
 
 673 pointer for GDIPlus or a cairo_t pointer for Cairo.  NOTE: For
 
 674 wxPython we still need a way to make this value usable.", "");
 
 677     %newobject CreateFromNative;
 
 679         static wxGraphicsContext* , CreateFromNativeWindow( void * window ) ,
 
 680         "Creates a wx.GraphicsContext from a native window.  NOTE: For wxPython
 
 681 we still need a way to make this value usable.", "");
 
 686         virtual wxGraphicsPath , CreatePath(),
 
 687         "Creates a native graphics path which is initially empty.", "");
 
 691         virtual wxGraphicsPen , CreatePen(const wxPen& pen),
 
 692         "Creates a native pen from a `wx.Pen`.", "");
 
 696         virtual wxGraphicsBrush , CreateBrush(const wxBrush& brush ),
 
 697         "Creates a native brush from a `wx.Brush`.", "");
 
 701         virtual wxGraphicsBrush ,
 
 702         CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
 
 703                                    const wxColour& c1, const wxColour& c2),
 
 704         "Creates a native brush, having a linear gradient, starting at (x1,y1)
 
 705 with color c1 to (x2,y2) with color c2.", "");
 
 709         virtual wxGraphicsBrush ,
 
 710         CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
 
 711                                    const wxColour &oColor, const wxColour &cColor),
 
 712         "Creates a native brush, having a radial gradient originating at point
 
 713 (xo,yc) with color oColour and ends on a circle around (xc,yc) with
 
 714 radius r and color cColour.", "");
 
 718         virtual wxGraphicsFont , CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ),
 
 719         "Creates a native graphics font from a `wx.Font` and a text colour.", "");
 
 723         virtual wxGraphicsMatrix , CreateMatrix( wxDouble a=1.0, wxDouble b=0.0,
 
 724                                                  wxDouble c=0.0, wxDouble d=1.0,
 
 725                                                  wxDouble tx=0.0, wxDouble ty=0.0),
 
 726         "Creates a native affine transformation matrix from the passed in
 
 727 values. The defaults result in an identity matrix.", "");
 
 732         virtual void , PushState(),
 
 733         "Push the current state of the context, (ie the transformation matrix)
 
 738         virtual void , PopState(),
 
 739         "Pops a stored state from the stack", "");
 
 743         virtual void , Clip( const wxRegion ®ion ),
 
 744         "Clips drawings to the region, combined to current clipping region.", "",
 
 749         virtual void , Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ),
 
 750         "Clips drawings to the rectangle.", "");
 
 754         virtual void , ResetClip(),
 
 755         "Resets the clipping to original shape.", "");
 
 759         virtual void * , GetNativeContext(),
 
 760         "Returns the native context (CGContextRef for Core Graphics, Graphics
 
 761 pointer for GDIPlus and cairo_t pointer for cairo).", "");
 
 765         virtual int , GetLogicalFunction() const,
 
 766         "Returns the current logical function.", "");
 
 770         virtual bool , SetLogicalFunction(int function) ,
 
 771         "Sets the current logical function, returns ``True`` if it supported", "");
 
 775         virtual void , Translate( wxDouble dx , wxDouble dy ),
 
 776         "Translates the current transformation matrix.", "");
 
 780         virtual void , Scale( wxDouble xScale , wxDouble yScale ),
 
 781         "Scale the current transformation matrix of the context.", "");
 
 785         virtual void , Rotate( wxDouble angle ),
 
 786         "Rotate the current transformation matrix of the context.  ``angle`` is
 
 787 specified in radians.", "");
 
 791         virtual void , ConcatTransform( const wxGraphicsMatrix& matrix ),
 
 792         "Concatenates the passed in transform with the current transform of
 
 797         virtual void , SetTransform( const wxGraphicsMatrix& matrix ),
 
 798         "Sets the current transform of this context.", "");
 
 802         virtual wxGraphicsMatrix , GetTransform() const,
 
 803         "Gets the current transformation matrix of this context.", "");
 
 807     DocStr(SetPen, "Sets the stroke pen", "");
 
 809     virtual void SetPen( const wxGraphicsPen& pen );
 
 810     void SetPen( const wxPen& pen );
 
 813     DocStr(SetBrush, "Sets the brush for filling", "");
 
 815     virtual void SetBrush( const wxGraphicsBrush& brush );
 
 816     void SetBrush( const wxBrush& brush );
 
 819     DocStr(SetFont, "Sets the font", "");
 
 821     virtual void SetFont( const wxGraphicsFont& font );
 
 822     void SetFont( const wxFont& font, const wxColour& colour = *wxBLACK);
 
 827         virtual void , StrokePath( const wxGraphicsPath& path ),
 
 828         "Strokes along a path with the current pen.", "");
 
 832         virtual void , FillPath( const wxGraphicsPath& path, int fillStyle = wxODDEVEN_RULE ),
 
 833         "Fills a path with the current brush.", "");
 
 837         virtual void , DrawPath( const wxGraphicsPath& path, int fillStyle = wxODDEVEN_RULE ),
 
 838         "Draws the path by first filling and then stroking.", "");
 
 843                "Draws a text string at the defined position.", "");
 
 844         void DrawText( const wxString &str, wxDouble x, wxDouble y,
 
 845                        const wxGraphicsBrush& backgroundBrush = wxNullGraphicsBrush )
 
 847             if ( !backgroundBrush.IsNull() )
 
 848                 self->DrawText(str, x, y, backgroundBrush);
 
 850                 self->DrawText(str, x, y);
 
 853         DocStr(DrawRotatedText,
 
 854                "Draws a text string at the defined position, at the specified angle,
 
 855 which is given in radians.", "");
 
 856         void DrawRotatedText(  const wxString &str, wxDouble x, wxDouble y, wxDouble angle,
 
 857                                const wxGraphicsBrush& backgroundBrush = wxNullGraphicsBrush )
 
 859             if ( !backgroundBrush.IsNull() )
 
 860                 self->DrawText(str, x, y, angle, backgroundBrush);
 
 862                 self->DrawText(str, x, y, angle);
 
 869         virtual void , GetTextExtent( const wxString &text,
 
 870                                       wxDouble *OUTPUT /*width*/,
 
 871                                       wxDouble *OUTPUT /*height*/,
 
 872                                       wxDouble *OUTPUT /*descent*/,
 
 873                                       wxDouble *OUTPUT /*externalLeading*/ ) const ,
 
 874         "GetFullTextExtent(self, text) --> (width, height, descent, externalLeading)",
 
 875         "Gets the dimensions of the string using the currently selected
 
 876 font. ``text`` is the string to measure, ``w`` and ``h`` are the total
 
 877 width and height respectively, ``descent`` is the dimension from the
 
 878 baseline of the font to the bottom of the descender, and
 
 879 ``externalLeading`` is any extra vertical space added to the font by
 
 880 the font designer (usually is zero).", "",
 
 884         DocAStr(GetTextExtent,
 
 885                 "GetTextExtent(self, text) --> (width, height)",
 
 886                 "Gets the dimensions of the string using the currently selected
 
 887 font. ``text`` is the string to measure, ``w`` and ``h`` are the total
 
 888 width and height respectively.", "");
 
 890         PyObject* GetTextExtent( const wxString &text )
 
 892             wxDouble width = 0.0,
 
 894             self->GetTextExtent(text, &width, &height, NULL, NULL);
 
 895             // thread wrapers are turned off for this .i file, so no need to acquire GIL...
 
 896             PyObject* rv = PyTuple_New(2);
 
 897             PyTuple_SET_ITEM(rv, 0, PyFloat_FromDouble(width));
 
 898             PyTuple_SET_ITEM(rv, 1, PyFloat_FromDouble(height));
 
 905         DocAStr(GetPartialTextExtents,
 
 906                 "GetPartialTextExtents(self, text) -> [widths]",
 
 907                 "Returns a list of widths from the beginning of ``text`` to the
 
 908 coresponding character in ``text``.", "");
 
 909         wxArrayDouble GetPartialTextExtents(const wxString& text) {
 
 910             wxArrayDouble widths;
 
 911             self->GetPartialTextExtents(text, widths);
 
 918         virtual void , DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ),
 
 919         "Draws the bitmap. In case of a mono bitmap, this is treated as a mask
 
 920 and the current brush is used for filling.", "");
 
 924         virtual void , DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ),
 
 925         "Draws the icon.", "");
 
 930         virtual void , StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2),
 
 931         "Strokes a single line.", "");
 
 935         virtual void , StrokeLines( size_t points, const wxPoint2D *points_array),
 
 936         "StrokeLines(self, List points)",
 
 937         "Stroke lines connecting each of the points", "");
 
 941         DocAStr(StrokeLineSegements,
 
 942                 "StrokeLineSegments(self, List beginPoints, List endPoints)",
 
 943                 "Stroke disconnected lines from begin to end points", "");
 
 944         void StrokeLineSegements(PyObject* beginPoints, PyObject* endPoints)
 
 946             size_t c1, c2, count;
 
 947             wxPoint2D* beginP = wxPoint2D_LIST_helper(beginPoints, &c1);
 
 948             wxPoint2D* endP =   wxPoint2D_LIST_helper(endPoints, &c2);
 
 950             if ( beginP != NULL && endP != NULL )
 
 952                 count = wxMin(c1, c2);
 
 953                 self->StrokeLines(count, beginP, endP);
 
 962         virtual void , DrawLines( size_t points, const wxPoint2D *points_array,
 
 963                                   int fillStyle = wxODDEVEN_RULE ),
 
 964         "Draws a polygon.", "");
 
 968         virtual void , DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h),
 
 969         "Draws a rectangle.", "");
 
 973         virtual void , DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h),
 
 974         "Draws an ellipse.", "");
 
 978         virtual void , DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius),
 
 979         "Draws a rounded rectangle", "");
 
 984         virtual bool , ShouldOffset() const,
 
 985         "helper to determine if a 0.5 offset should be applied for the drawing operation", "");
 
 990 //---------------------------------------------------------------------------
 
 992 class wxGraphicsRenderer : public wxObject
 
 995     // wxGraphicsRenderer();  This is an ABC, use GetDefaultRenderer
 
 997     virtual ~wxGraphicsRenderer();
 
 999     // %newobject GetDefaultRenderer;  ???
 
1000     static wxGraphicsRenderer* GetDefaultRenderer();
 
1002     %nokwargs CreateContext;
 
1003     %newobject CreateContext;
 
1004     virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc) ;
 
1005     virtual wxGraphicsContext * CreateContext( wxWindow* window );
 
1007     // create a context that can be used for measuring texts only, no drawing allowed
 
1008     virtual wxGraphicsContext * CreateMeasuringContext();
 
1010     %newobject CreateContextFromNativeContext;
 
1011     virtual wxGraphicsContext * CreateContextFromNativeContext( void * context );
 
1013     %newobject CreateContextFromNativeWindow;
 
1014     virtual wxGraphicsContext * CreateContextFromNativeWindow( void * window );
 
1017     virtual wxGraphicsPath CreatePath();
 
1019     virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, 
 
1020                                            wxDouble tx=0.0, wxDouble ty=0.0);
 
1022     virtual wxGraphicsPen CreatePen(const wxPen& pen) ;
 
1024     virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) ;
 
1026     virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, 
 
1027                                                         const wxColour&c1, const wxColour&c2);
 
1029     virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
 
1030                                                         const wxColour &oColor, const wxColour &cColor);
 
1032     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK );
 
1038 //---------------------------------------------------------------------------
 
1041 #include "wx/dcgraph.h"
 
1044 class wxGCDC: public wxDC
 
1048     %pythonAppend wxGCDC
 
1049         "self.__dc = args[0] # save a ref so the other dc will not be deleted before self";
 
1050     wxGCDC(const wxWindowDC& dc);
 
1051     wxGCDC(wxWindow* window);
 
1055     wxGraphicsContext* GetGraphicsContext();
 
1056     virtual void SetGraphicsContext( wxGraphicsContext* ctx );
 
1058     %property(GraphicsContext, GetGraphicsContext, SetGraphicsContext);
 
1062 //---------------------------------------------------------------------------
 
1064 // Turn GIL acquisition back on.