1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: graphics context header
4 // Author: Stefan Csomor
7 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_GRAPHICS_H_
13 #define _WX_GRAPHICS_H_
15 #if wxUSE_GRAPHICS_CONTEXT
17 #include "wx/geometry.h"
18 #include "wx/dynarray.h"
20 class WXDLLEXPORT wxWindowDC
;
23 * notes about the graphics context apis
25 * angles : are measured in radians, 0.0 being in direction of positiv x axis, PI/2 being
26 * in direction of positive y axis.
29 class WXDLLEXPORT wxGraphicsPath
: public wxObject
33 virtual ~wxGraphicsPath() {}
36 // These are the path primitives from which everything else can be constructed
39 // begins a new subpath at (x,y)
40 virtual void MoveToPoint( wxDouble x
, wxDouble y
) = 0;
42 // adds a straight line from the current point to (x,y)
43 virtual void AddLineToPoint( wxDouble x
, wxDouble y
) = 0;
45 // adds a cubic Bezier curve from the current point, using two control points and an end point
46 virtual void AddCurveToPoint( wxDouble cx1
, wxDouble cy1
, wxDouble cx2
, wxDouble cy2
, wxDouble x
, wxDouble y
) = 0;
48 // closes the current sub-path
49 virtual void CloseSubpath() = 0;
51 // gets the last point of the current path, (0,0) if not yet set
52 virtual void GetCurrentPoint( wxDouble
& x
, wxDouble
&y
) = 0;
54 // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle
55 virtual void AddArc( wxDouble x
, wxDouble y
, wxDouble r
, wxDouble startAngle
, wxDouble endAngle
, bool clockwise
) = 0;
58 // These are convenience functions which - if not available natively will be assembled
59 // using the primitives from above
62 // adds a quadratic Bezier curve from the current point, using a control point and an end point
63 virtual void AddQuadCurveToPoint( wxDouble cx
, wxDouble cy
, wxDouble x
, wxDouble y
);
65 // appends a rectangle as a new closed subpath
66 virtual void AddRectangle( wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
68 // appends an ellipsis as a new closed subpath fitting the passed rectangle
69 virtual void AddCircle( wxDouble x
, wxDouble y
, wxDouble r
);
71 // 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)
72 virtual void AddArcToPoint( wxDouble x1
, wxDouble y1
, wxDouble x2
, wxDouble y2
, wxDouble r
) ;
74 // wrappers using wxPoint2DDoubles
76 wxPoint2DDouble
GetCurrentPoint();
78 void MoveToPoint( const wxPoint2DDouble
& p
);
80 void AddLineToPoint( const wxPoint2DDouble
& p
);
82 void AddCurveToPoint( const wxPoint2DDouble
& c1
, const wxPoint2DDouble
& c2
, const wxPoint2DDouble
& e
);
84 void AddArc( const wxPoint2DDouble
& c
, wxDouble r
, wxDouble startAngle
, wxDouble endAngle
, bool clockwise
);
86 // returns the native path
87 virtual void * GetNativePath() const = 0;
89 // give the native path returned by GetNativePath() back (there might be some deallocations necessary)
90 virtual void UnGetNativePath(void *p
) = 0;
92 DECLARE_NO_COPY_CLASS(wxGraphicsPath
)
93 DECLARE_ABSTRACT_CLASS(wxGraphicsPath
)
97 class WXDLLEXPORT wxGraphicsMatrix
100 wxGraphicsMatrix() {}
102 virtual ~wxGraphicsMatrix() {}
104 wxGraphicsMatrix* Concat( const wxGraphicsMatrix *t ) const;
106 // returns the inverse matrix
107 wxGraphicsMatrix* Invert() const;
109 // returns true if the elements of the transformation matrix are equal ?
110 bool operator==(const wxGraphicsMatrix& t) const;
112 // return true if this is the identity matrix
120 virtual void Translate( wxDouble dx , wxDouble dy ) = 0;
123 virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0;
126 virtual void Rotate( wxDouble angle ) = 0;
130 class WXDLLEXPORT wxGraphicsContext
: public wxObject
133 wxGraphicsContext() {}
135 virtual ~wxGraphicsContext() {}
137 static wxGraphicsContext
* Create( const wxWindowDC
& dc
) ;
139 static wxGraphicsContext
* CreateFromNative( void * context
) ;
142 static wxGraphicsContext
* CreateFromNativeWindow( void * window
) ;
144 static wxGraphicsContext
* Create( wxWindow
* window
) ;
146 // creates a path instance that corresponds to the type of graphics context, ie GDIPlus, cairo, CoreGraphics ...
147 virtual wxGraphicsPath
* CreatePath() = 0;
150 // create a 'native' matrix corresponding to these values
151 virtual wxGraphicsMatrix* CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
152 wxDouble tx=0.0, wxDouble ty=0.0) = 0;
155 // push the current state of the context, ie the transformation matrix on a stack
156 virtual void PushState() = 0;
158 // pops a stored state from the stack
159 virtual void PopState() = 0;
161 // clips drawings to the region, combined to current clipping region
162 virtual void Clip( const wxRegion
®ion
) = 0;
164 // clips drawings to the rect
165 virtual void Clip( wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
) = 0;
167 // resets the clipping to original extent
168 virtual void ResetClip() = 0 ;
170 // returns the native context
171 virtual void * GetNativeContext() = 0;
174 // transformation : changes the current transformation matrix CTM of the context
178 virtual void Translate( wxDouble dx
, wxDouble dy
) = 0;
181 virtual void Scale( wxDouble xScale
, wxDouble yScale
) = 0;
184 virtual void Rotate( wxDouble angle
) = 0;
191 virtual void SetPen( const wxPen
&pen
) = 0;
193 // sets the brush for filling
194 virtual void SetBrush( const wxBrush
&brush
) = 0;
196 // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
197 virtual void SetLinearGradientBrush( wxDouble x1
, wxDouble y1
, wxDouble x2
, wxDouble y2
,
198 const wxColour
&c1
, const wxColour
&c2
) = 0;
200 // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc)
201 // with radius r and color cColor
202 virtual void SetRadialGradientBrush( wxDouble xo
, wxDouble yo
, wxDouble xc
, wxDouble yc
, wxDouble radius
,
203 const wxColour
&oColor
, const wxColour
&cColor
) = 0;
206 virtual void SetFont( const wxFont
&font
) = 0;
208 // sets the text color
209 virtual void SetTextColor( const wxColour
&col
) = 0;
211 // strokes along a path with the current pen
212 virtual void StrokePath( const wxGraphicsPath
*path
) = 0;
214 // fills a path with the current brush
215 virtual void FillPath( const wxGraphicsPath
*path
, int fillStyle
= wxWINDING_RULE
) = 0;
217 // draws a path by first filling and then stroking
218 virtual void DrawPath( const wxGraphicsPath
*path
, int fillStyle
= wxWINDING_RULE
);
224 virtual void DrawText( const wxString
&str
, wxDouble x
, wxDouble y
) = 0;
226 virtual void DrawText( const wxString
&str
, wxDouble x
, wxDouble y
, wxDouble angle
);
228 virtual void GetTextExtent( const wxString
&text
, wxDouble
*width
, wxDouble
*height
,
229 wxDouble
*descent
, wxDouble
*externalLeading
) const = 0;
231 virtual void GetPartialTextExtents(const wxString
& text
, wxArrayDouble
& widths
) const = 0;
237 virtual void DrawBitmap( const wxBitmap
&bmp
, wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
) = 0;
239 virtual void DrawIcon( const wxIcon
&icon
, wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
) = 0;
242 // convenience methods
245 // strokes a single line
246 virtual void StrokeLine( wxDouble x1
, wxDouble y1
, wxDouble x2
, wxDouble y2
);
248 // stroke lines connecting each of the points
249 virtual void StrokeLines( size_t n
, const wxPoint2DDouble
*points
);
251 // stroke disconnected lines from begin to end points
252 virtual void StrokeLines( size_t n
, const wxPoint2DDouble
*beginPoints
, const wxPoint2DDouble
*endPoints
);
255 virtual void DrawLines( size_t n
, const wxPoint2DDouble
*points
, int fillStyle
= wxWINDING_RULE
);
258 virtual void DrawRectangle( wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
261 virtual void DrawEllipse( wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
263 // draws a rounded rectangle
264 virtual void DrawRoundedRectangle( wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
, wxDouble radius
);
266 // wrappers using wxPoint2DDouble TODO
268 DECLARE_NO_COPY_CLASS(wxGraphicsContext
)
269 DECLARE_ABSTRACT_CLASS(wxGraphicsContext
)
274 #endif // _WX_GRAPHICS_H_