From 6d61d718f21e79a0f1cac1b41db1dab06cb6306e Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Tue, 3 Oct 2006 21:36:33 +0000 Subject: [PATCH] Add wrappers for wxGraphicsPath and wxGraphicsContext. This is still a work in progress. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41613 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/setup.py | 1 + wxPython/src/_graphics.i | 450 +++++++++++++++++++++++++++++++++++++++ wxPython/src/gdi.i | 1 + 3 files changed, 452 insertions(+) create mode 100644 wxPython/src/_graphics.i diff --git a/wxPython/setup.py b/wxPython/setup.py index d910f2a7ac..43a2a37691 100755 --- a/wxPython/setup.py +++ b/wxPython/setup.py @@ -193,6 +193,7 @@ swig_sources = run_swig(['gdi.i'], 'src', GENDIR, PKGDIR, 'src/_bitmap.i', 'src/_colour.i', 'src/_dc.i', + 'src/_graphics.i', 'src/_gdiobj.i', 'src/_imaglist.i', 'src/_region.i', diff --git a/wxPython/src/_graphics.i b/wxPython/src/_graphics.i new file mode 100644 index 0000000000..848dc43bde --- /dev/null +++ b/wxPython/src/_graphics.i @@ -0,0 +1,450 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: _graphics.i +// Purpose: Wrapper definitions for wx.GraphicsPath, wx.GraphicsContext +// +// Author: Robin Dunn +// +// Created: 2-Oct-2006 +// RCS-ID: $Id$ +// Copyright: (c) 2006 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// Not a %module + + +//--------------------------------------------------------------------------- +%newgroup + +%{ +#include +%} + +//--------------------------------------------------------------------------- + + +%{ +#if !wxUSE_GRAPHICS_CONTEXT +// C++ stub classes for platforms that don't have wxGraphicsContext yet. + +class wxGraphicsPath +{ +public : + wxGraphicsPath() { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + PyErr_SetString(PyExc_NotImplementedError, + "wxGraphicsPath is not available on this platform."); + wxPyEndBlockThreads(blocked); + } + virtual ~wxGraphicsPath() {} + + void MoveToPoint( wxDouble, wxDouble ) {} + void AddLineToPoint( wxDouble, wxDouble ) {} + void AddCurveToPoint( wxDouble, wxDouble, wxDouble, wxDouble, wxDouble, wxDouble ) {} + void CloseSubpath() {} + void GetCurrentPoint( wxDouble&, wxDouble&) {} + void AddArc( wxDouble, wxDouble, wxDouble, wxDouble, wxDouble, bool ) {} + + void AddQuadCurveToPoint( wxDouble, wxDouble, wxDouble, wxDouble ) {} + void AddRectangle( wxDouble, wxDouble, wxDouble, wxDouble ) {} + void AddCircle( wxDouble, wxDouble, wxDouble ) {} + void AddArcToPoint( wxDouble, wxDouble , wxDouble, wxDouble, wxDouble ) {} + + wxPoint2DDouble GetCurrentPoint() { return wxPoint2DDouble(0,0); } + void MoveToPoint( const wxPoint2DDouble& ) {} + void AddLineToPoint( const wxPoint2DDouble&) {} + void AddCurveToPoint( const wxPoint2DDouble&, const wxPoint2DDouble&, const wxPoint2DDouble&) {} + void AddArc( const wxPoint2DDouble&, wxDouble, wxDouble, wxDouble, bool) {} +}; + + +class wxGraphicsContext +{ +public: + wxGraphicsContext() { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + PyErr_SetString(PyExc_NotImplementedError, + "wxGraphicsContext is not available on this platform."); + wxPyEndBlockThreads(blocked); + } + virtual ~wxGraphicsContext() {} + + static wxGraphicsContext* Create( const wxWindowDC&) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + PyErr_SetString(PyExc_NotImplementedError, + "wxGraphicsPath is not available on this platform."); + wxPyEndBlockThreads(blocked); + return NULL; + } + + wxGraphicsPath * CreatePath() {} + void PushState() {} + void PopState() {} + void Clip( const wxRegion & ) {} + void Translate( wxDouble , wxDouble ) {} + void Scale( wxDouble , wxDouble ) {} + void Rotate( wxDouble ) {} + void SetPen( const wxPen & ) {} + void SetBrush( const wxBrush & ) {} + void SetLinearGradientBrush( wxDouble , wxDouble , wxDouble , wxDouble , + const wxColour&, const wxColour&) {} + void SetRadialGradientBrush( wxDouble , wxDouble , wxDouble , wxDouble , wxDouble , + const wxColour &, const wxColour &) {} + void SetFont( const wxFont & ) {} + void SetTextColor( const wxColour & ) {} + void StrokePath( const wxGraphicsPath * ) {} + void FillPath( const wxGraphicsPath *, int ) {} + void DrawPath( const wxGraphicsPath *, int ) {} + void DrawText( const wxString &, wxDouble , wxDouble ) {} + void DrawText( const wxString &, wxDouble , wxDouble , wxDouble ) {} + void GetTextExtent( const wxString &, wxDouble *, wxDouble *, + wxDouble *, wxDouble * ) const {} + void GetPartialTextExtents(const wxString& , wxArrayDouble& ) const {} + void DrawBitmap( const wxBitmap &, wxDouble , wxDouble , wxDouble , wxDouble ) {} + void DrawIcon( const wxIcon &, wxDouble , wxDouble , wxDouble , wxDouble ) {} + void StrokeLine( wxDouble , wxDouble , wxDouble , wxDouble ) {} + void StrokeLines( size_t , const wxPoint2DDouble *) {} + void StrokeLines( size_t , const wxPoint2DDouble *, const wxPoint2DDouble *) {} + void DrawLines( size_t , const wxPoint2DDouble *, int ) {} + void DrawRectangle( wxDouble , wxDouble , wxDouble , wxDouble ) {} + void DrawEllipse( wxDouble , wxDouble, wxDouble , wxDouble) {} + void DrawRoundedRectangle( wxDouble , wxDouble , wxDouble , wxDouble , wxDouble ) {} +}; + + +class wxGCDC: public wxWindowDC +{ +public: + wxGCDC(const wxWindowDC&) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + PyErr_SetString(PyExc_NotImplementedError, + "wxGCDC is not available on this platform."); + wxPyEndBlockThreads(blocked); + } + + wxGCDC() { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + PyErr_SetString(PyExc_NotImplementedError, + "wxGCDC is not available on this platform."); + wxPyEndBlockThreads(blocked); + } + + virtual ~wxGCDC() {} + + wxGraphicsContext* GetGraphicContext() { return NULL; } +}; + +#endif +%} + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + +MustHaveApp(wxGraphicsPath); +MustHaveApp(wxGraphicsContext); +MustHaveApp(wxGCDC); + +//#define wxDouble double +typedef double wxDouble; + + +// TODO: Decide which of the overloaded methods should use the primary names + +class wxGraphicsPath +{ +public : + //wxGraphicsPath(); *** This class is an ABC, so we can't allow instances to be created directly + virtual ~wxGraphicsPath(); + + + DocDeclStr( + virtual void , MoveToPoint( wxDouble x, wxDouble y ), + "Begins a new subpath at (x,y)", ""); +// void MoveToPoint( const wxPoint2D& p); + + + DocDeclStr( + virtual void , AddLineToPoint( wxDouble x, wxDouble y ), + "Adds a straight line from the current point to (x,y) ", ""); +// void AddLineToPoint( const wxPoint2D& p); + + + DocDeclStr( + virtual void , AddCurveToPoint( wxDouble cx1, wxDouble cy1, + wxDouble cx2, wxDouble cy2, + wxDouble x, wxDouble y ), + "Adds a cubic Bezier curve from the current point, using two control +points and an end point", ""); +// void AddCurveToPoint( const wxPoint2D& c1, const wxPoint2D& c2, const wxPoint2D& e); + + + DocDeclStr( + virtual void , CloseSubpath(), + "closes the current sub-path", ""); + + + //virtual void , GetCurrentPoint( wxDouble& x, wxDouble&y), + DocDeclStr( + wxPoint2D , GetCurrentPoint(), + "Gets the last point of the current path, (0,0) if not yet set", ""); + + + DocDeclStr( + virtual void , AddArc( wxDouble x, wxDouble y, wxDouble r, + wxDouble startAngle, wxDouble endAngle, bool clockwise ), + "Adds an arc of a circle centering at (x,y) with radius (r) from +startAngle to endAngle", ""); +// void AddArc( const wxPoint2D& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise); + + + DocDeclStr( + virtual void , AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ), + "Adds a quadratic Bezier curve from the current point, using a control +point and an end point", ""); + + + DocDeclStr( + virtual void , AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ), + "Appends a rectangle as a new closed subpath", ""); + + + DocDeclStr( + virtual void , AddCircle( wxDouble x, wxDouble y, wxDouble r ), + "Appends an ellipsis as a new closed subpath fitting the passed rectangle", ""); + + + DocDeclStr( + virtual void , AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) , + "Draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) +to (x2,y2), also a straight line from (current) to (x1,y1)", ""); + + +}; + +//--------------------------------------------------------------------------- + + +class wxGraphicsContext +{ +public: + // wxGraphicsContext() This is also an ABC, use Create to make an instance... + virtual ~wxGraphicsContext(); + + static wxGraphicsContext* Create( const wxWindowDC& dc); + + // creates a path instance that corresponds to the type of graphics context, ie GDIPlus, cairo, CoreGraphics ... + DocDeclStr( + virtual wxGraphicsPath * , CreatePath(), + "", ""); + + + // push the current state of the context, ie the transformation matrix on a stack + DocDeclStr( + virtual void , PushState(), + "", ""); + + + // pops a stored state from the stack + DocDeclStr( + virtual void , PopState(), + "", ""); + + + // clips drawings to the region + DocDeclStr( + virtual void , Clip( const wxRegion ®ion ), + "", ""); + + + // + // transformation + // + + // translate + DocDeclStr( + virtual void , Translate( wxDouble dx , wxDouble dy ), + "", ""); + + + // scale + DocDeclStr( + virtual void , Scale( wxDouble xScale , wxDouble yScale ), + "", ""); + + + // rotate (radians) + DocDeclStr( + virtual void , Rotate( wxDouble angle ), + "", ""); + + + // + // setting the paint + // + + // sets the pan + DocDeclStr( + virtual void , SetPen( const wxPen &pen ), + "", ""); + + + // sets the brush for filling + DocDeclStr( + virtual void , SetBrush( const wxBrush &brush ), + "", ""); + + + // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 + DocDeclStr( + virtual void , SetLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2), + "", ""); + + + // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc) + // with radius r and color cColor + DocDeclStr( + virtual void , SetRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, + wxDouble radius, + const wxColour &oColor, const wxColour &cColor), + "", ""); + + + // sets the font + DocDeclStr( + virtual void , SetFont( const wxFont &font ), + "", ""); + + + // sets the text color + DocDeclStr( + virtual void , SetTextColor( const wxColour &col ), + "", ""); + + + // strokes along a path with the current pen + DocDeclStr( + virtual void , StrokePath( const wxGraphicsPath *path ), + "", ""); + + + // fills a path with the current brush + DocDeclStr( + virtual void , FillPath( const wxGraphicsPath *path, int fillStyle = wxWINDING_RULE ), + "", ""); + + + // draws a path by first filling and then stroking + DocDeclStr( + virtual void , DrawPath( const wxGraphicsPath *path, int fillStyle = wxWINDING_RULE ), + "", ""); + + + // + // text + // + + DocDeclStr( + virtual void , DrawText( const wxString &str, wxDouble x, wxDouble y ), + "", ""); + + + DocDeclStr( + virtual void , DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ), + "", ""); + + + DocDeclStr( + virtual void , GetTextExtent( const wxString &text, + wxDouble *OUTPUT /*width*/, + wxDouble *OUTPUT /*height*/, + wxDouble *OUTPUT /*descent*/, + wxDouble *OUTPUT /*externalLeading*/ ) const , + "", ""); + + + DocDeclStr( + virtual void , GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const, + "", ""); + + + // + // image support + // + + DocDeclStr( + virtual void , DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ), + "", ""); + + + DocDeclStr( + virtual void , DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ), + "", ""); + + + // + // convenience methods + // + + // strokes a single line + DocDeclStr( + virtual void , StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2), + "", ""); + + + // stroke lines connecting each of the points + DocDeclStr( + virtual void , StrokeLines( size_t n, const wxPoint2D *points), + "", ""); + + + // stroke disconnected lines from begin to end points + DocDeclStr( + virtual void , StrokeLines( size_t n, const wxPoint2D *beginPoints, const wxPoint2D *endPoints), + "", ""); + + + // draws a polygon + DocDeclStr( + virtual void , DrawLines( size_t n, const wxPoint2D *points, int fillStyle = wxWINDING_RULE ), + "", ""); + + + // draws a polygon + DocDeclStr( + virtual void , DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h), + "", ""); + + + // draws an ellipse + DocDeclStr( + virtual void , DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h), + "", ""); + + + // draws a rounded rectangle + DocDeclStr( + virtual void , DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius), + "", ""); + + +}; + + +//--------------------------------------------------------------------------- + + +class wxGCDC: public wxDC +{ +public: + wxGCDC(const wxWindowDC& dc); + //wxGCDC(); + virtual ~wxGCDC(); + + wxGraphicsContext* GetGraphicContext(); +}; + + + + +//--------------------------------------------------------------------------- diff --git a/wxPython/src/gdi.i b/wxPython/src/gdi.i index fe351aebe3..b2a8343930 100644 --- a/wxPython/src/gdi.i +++ b/wxPython/src/gdi.i @@ -42,6 +42,7 @@ MAKE_CONST_WXSTRING_NOSWIG(EmptyString); %include _font.i %include _intl.i %include _dc.i +%include _graphics.i %include _imaglist.i %include _stockobjs.i %include _effects.i -- 2.45.2