1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/graphics.h
3 // Purpose:     graphics context header
4 // Author:      Stefan Csomor
5 // Modified by:
6 // Created:
7 // Copyright:   (c) Stefan Csomor
8 // RCS-ID:      $Id: graphics.h 60190 2009-04-16 00:57:35Z KO $
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_GRAPHICS_H_
13 #define _WX_GRAPHICS_H_
14 
15 #include "wx/defs.h"
16 
17 #if wxUSE_GRAPHICS_CONTEXT
18 
19 #include "wx/geometry.h"
20 #include "wx/dynarray.h"
21 
22 class WXDLLIMPEXP_CORE wxWindowDC;
23 class WXDLLIMPEXP_CORE wxMemoryDC;
24 class WXDLLIMPEXP_CORE wxGraphicsContext;
25 class WXDLLIMPEXP_CORE wxGraphicsPath;
26 class WXDLLIMPEXP_CORE wxGraphicsMatrix;
27 class WXDLLIMPEXP_CORE wxGraphicsFigure;
28 class WXDLLIMPEXP_CORE wxGraphicsRenderer;
29 class WXDLLIMPEXP_CORE wxGraphicsPen;
30 class WXDLLIMPEXP_CORE wxGraphicsBrush;
31 class WXDLLIMPEXP_CORE wxGraphicsFont;
32 class WXDLLIMPEXP_CORE wxGraphicsBitmap;
33 
34 /*
35  * notes about the graphics context apis
36  *
37  * angles : are measured in radians, 0.0 being in direction of positiv x axis, PI/2 being
38  * in direction of positive y axis.
39  */
40 
41 // Base class of all objects used for drawing in the new graphics API, the always point back to their
42 // originating rendering engine, there is no dynamic unloading of a renderer currently allowed,
43 // these references are not counted
44 
45 //
46 // The data used by objects like graphics pens etc is ref counted, in order to avoid unnecessary expensive
47 // duplication. Any operation on a shared instance that results in a modified state, uncouples this
48 // instance from the other instances that were shared - using copy on write semantics
49 //
50 
51 class WXDLLIMPEXP_CORE wxGraphicsObjectRefData : public wxObjectRefData
52 {
53 public :
54     wxGraphicsObjectRefData( wxGraphicsRenderer* renderer );
55     wxGraphicsObjectRefData( const wxGraphicsObjectRefData* data );
56     wxGraphicsRenderer* GetRenderer() const ;
57     virtual wxGraphicsObjectRefData* Clone() const ;
58 
59 protected :
60     wxGraphicsRenderer* m_renderer;
61 } ;
62 
63 class WXDLLIMPEXP_CORE wxGraphicsObject : public wxObject
64 {
65 public :
66     wxGraphicsObject() ;
67 #if wxABI_VERSION >= 20810
wxGraphicsObject(const wxGraphicsObject & other)68     wxGraphicsObject( const wxGraphicsObject& other) : wxObject( other ) {}
69     wxGraphicsObject& operator= (const wxGraphicsObject & other) { Ref(other); return *this;}
70 #endif
71     wxGraphicsObject( wxGraphicsRenderer* renderer ) ;
72     virtual ~wxGraphicsObject() ;
73 
74     bool IsNull() const ;
75 
76     // returns the renderer that was used to create this instance, or NULL if it has not been initialized yet
77     wxGraphicsRenderer* GetRenderer() const ;
78     wxGraphicsObjectRefData* GetGraphicsData() const ;
79 protected :
80     virtual wxObjectRefData* CreateRefData() const;
81     virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const;
82 
83     DECLARE_DYNAMIC_CLASS(wxGraphicsObject)
84 } ;
85 
86 class WXDLLIMPEXP_CORE wxGraphicsPen : public wxGraphicsObject
87 {
88 public :
wxGraphicsPen()89     wxGraphicsPen() {}
90 #if wxABI_VERSION >= 20810
wxGraphicsPen(const wxGraphicsPen & other)91     wxGraphicsPen( const wxGraphicsPen& other) : wxGraphicsObject( other ) {}
92     wxGraphicsPen& operator= (const wxGraphicsPen & other) { Ref(other); return *this;}
93 #endif
~wxGraphicsPen()94     virtual ~wxGraphicsPen() {}
95 private :
96     DECLARE_DYNAMIC_CLASS(wxGraphicsPen)
97 } ;
98 
99 extern WXDLLEXPORT_DATA(wxGraphicsPen) wxNullGraphicsPen;
100 
101 class WXDLLIMPEXP_CORE wxGraphicsBrush : public wxGraphicsObject
102 {
103 public :
wxGraphicsBrush()104     wxGraphicsBrush() {}
105 #if wxABI_VERSION >= 20810
wxGraphicsBrush(const wxGraphicsBrush & other)106     wxGraphicsBrush( const wxGraphicsBrush& other) : wxGraphicsObject( other ) {}
107     wxGraphicsBrush& operator= (const wxGraphicsBrush & other) { Ref(other); return *this;}
108 #endif
~wxGraphicsBrush()109     virtual ~wxGraphicsBrush() {}
110 private :
111     DECLARE_DYNAMIC_CLASS(wxGraphicsBrush)
112 } ;
113 
114 extern WXDLLEXPORT_DATA(wxGraphicsBrush) wxNullGraphicsBrush;
115 
116 class WXDLLIMPEXP_CORE wxGraphicsFont : public wxGraphicsObject
117 {
118 public :
wxGraphicsFont()119     wxGraphicsFont() {}
120 #if wxABI_VERSION >= 20810
wxGraphicsFont(const wxGraphicsFont & other)121     wxGraphicsFont( const wxGraphicsFont& other) : wxGraphicsObject( other ) {}
122     wxGraphicsFont& operator= (const wxGraphicsFont & other) { Ref(other); return *this;}
123 #endif
~wxGraphicsFont()124     virtual ~wxGraphicsFont() {}
125 private :
126     DECLARE_DYNAMIC_CLASS(wxGraphicsFont)
127 } ;
128 
129 extern WXDLLEXPORT_DATA(wxGraphicsFont) wxNullGraphicsFont;
130 
131 class WXDLLIMPEXP_CORE wxGraphicsBitmap : public wxGraphicsObject
132 {
133 public :
wxGraphicsBitmap()134     wxGraphicsBitmap() {}
135 #if wxABI_VERSION >= 20810
wxGraphicsBitmap(const wxGraphicsBitmap & other)136     wxGraphicsBitmap( const wxGraphicsBitmap& other) : wxGraphicsObject( other ) {}
137     wxGraphicsBitmap& operator= (const wxGraphicsBitmap & other) { Ref(other); return *this;}
138 #endif
~wxGraphicsBitmap()139     virtual ~wxGraphicsBitmap() {}
140 private :
141     DECLARE_DYNAMIC_CLASS(wxGraphicsBitmap)
142 } ;
143 
144 extern WXDLLEXPORT_DATA(wxGraphicsBitmap) wxNullGraphicsBitmap;
145 
146 class WXDLLIMPEXP_CORE wxGraphicsMatrixData : public wxGraphicsObjectRefData
147 {
148 public :
wxGraphicsMatrixData(wxGraphicsRenderer * renderer)149     wxGraphicsMatrixData( wxGraphicsRenderer* renderer) :
150        wxGraphicsObjectRefData(renderer) {}
151 
~wxGraphicsMatrixData()152        virtual ~wxGraphicsMatrixData() {}
153 
154        // concatenates the matrix
155        virtual void Concat( const wxGraphicsMatrixData *t ) = 0;
156 
157        // sets the matrix to the respective values
158        virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
159            wxDouble tx=0.0, wxDouble ty=0.0) = 0;
160 
161        // gets the component valuess of the matrix
162        virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL,  wxDouble* c=NULL,
163                         wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const = 0;
164 
165        // makes this the inverse matrix
166        virtual void Invert() = 0;
167 
168        // returns true if the elements of the transformation matrix are equal ?
169        virtual bool IsEqual( const wxGraphicsMatrixData* t) const  = 0;
170 
171        // return true if this is the identity matrix
172        virtual bool IsIdentity() const = 0;
173 
174        //
175        // transformation
176        //
177 
178        // add the translation to this matrix
179        virtual void Translate( wxDouble dx , wxDouble dy ) = 0;
180 
181        // add the scale to this matrix
182        virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0;
183 
184        // add the rotation to this matrix (radians)
185        virtual void Rotate( wxDouble angle ) = 0;
186 
187        //
188        // apply the transforms
189        //
190 
191        // applies that matrix to the point
192        virtual void TransformPoint( wxDouble *x, wxDouble *y ) const = 0;
193 
194        // applies the matrix except for translations
195        virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const =0;
196 
197        // returns the native representation
198        virtual void * GetNativeMatrix() const = 0;
199 } ;
200 
201 class WXDLLIMPEXP_CORE wxGraphicsMatrix : public wxGraphicsObject
202 {
203 public :
wxGraphicsMatrix()204     wxGraphicsMatrix() {}
205 #if wxABI_VERSION >= 20810
wxGraphicsMatrix(const wxGraphicsMatrix & other)206     wxGraphicsMatrix( const wxGraphicsMatrix& other) : wxGraphicsObject( other ) {}
207     wxGraphicsMatrix& operator= (const wxGraphicsMatrix & other) { Ref(other); return *this;}
208 #endif
209 
~wxGraphicsMatrix()210     virtual ~wxGraphicsMatrix() {}
211 
212     // concatenates the matrix
213     virtual void Concat( const wxGraphicsMatrix *t );
Concat(const wxGraphicsMatrix & t)214     void Concat( const wxGraphicsMatrix &t ) { Concat( &t ); }
215 
216     // sets the matrix to the respective values
217     virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
218         wxDouble tx=0.0, wxDouble ty=0.0);
219 
220     // gets the component valuess of the matrix
221     virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL,  wxDouble* c=NULL,
222                      wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const;
223 
224     // makes this the inverse matrix
225     virtual void Invert();
226 
227     // returns true if the elements of the transformation matrix are equal ?
228     virtual bool IsEqual( const wxGraphicsMatrix* t) const;
IsEqual(const wxGraphicsMatrix & t)229     bool IsEqual( const wxGraphicsMatrix& t) const { return IsEqual( &t ); }
230 
231     // return true if this is the identity matrix
232     virtual bool IsIdentity() const;
233 
234     //
235     // transformation
236     //
237 
238     // add the translation to this matrix
239     virtual void Translate( wxDouble dx , wxDouble dy );
240 
241     // add the scale to this matrix
242     virtual void Scale( wxDouble xScale , wxDouble yScale );
243 
244     // add the rotation to this matrix (radians)
245     virtual void Rotate( wxDouble angle );
246 
247     //
248     // apply the transforms
249     //
250 
251     // applies that matrix to the point
252     virtual void TransformPoint( wxDouble *x, wxDouble *y ) const;
253 
254     // applies the matrix except for translations
255     virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const;
256 
257     // returns the native representation
258     virtual void * GetNativeMatrix() const;
259 
GetMatrixData()260     const wxGraphicsMatrixData* GetMatrixData() const
261     { return (const wxGraphicsMatrixData*) GetRefData(); }
GetMatrixData()262     wxGraphicsMatrixData* GetMatrixData()
263     { return (wxGraphicsMatrixData*) GetRefData(); }
264 
265 private :
266     DECLARE_DYNAMIC_CLASS(wxGraphicsMatrix)
267 } ;
268 
269 extern WXDLLEXPORT_DATA(wxGraphicsMatrix) wxNullGraphicsMatrix;
270 
271 class WXDLLIMPEXP_CORE wxGraphicsPathData : public wxGraphicsObjectRefData
272 {
273 public :
wxGraphicsPathData(wxGraphicsRenderer * renderer)274     wxGraphicsPathData(wxGraphicsRenderer* renderer) : wxGraphicsObjectRefData(renderer) {}
~wxGraphicsPathData()275     virtual ~wxGraphicsPathData() {}
276 
277     //
278     // These are the path primitives from which everything else can be constructed
279     //
280 
281     // begins a new subpath at (x,y)
282     virtual void MoveToPoint( wxDouble x, wxDouble y ) = 0;
283 
284     // adds a straight line from the current point to (x,y)
285     virtual void AddLineToPoint( wxDouble x, wxDouble y ) = 0;
286 
287     // adds a cubic Bezier curve from the current point, using two control points and an end point
288     virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) = 0;
289 
290     // adds another path
291     virtual void AddPath( const wxGraphicsPathData* path ) =0;
292 
293     // closes the current sub-path
294     virtual void CloseSubpath() = 0;
295 
296     // gets the last point of the current path, (0,0) if not yet set
297     virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const = 0;
298 
299     // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle
300     virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) = 0;
301 
302     //
303     // These are convenience functions which - if not available natively will be assembled
304     // using the primitives from above
305     //
306 
307     // adds a quadratic Bezier curve from the current point, using a control point and an end point
308     virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y );
309 
310     // appends a rectangle as a new closed subpath
311     virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h );
312 
313     // appends an ellipsis as a new closed subpath fitting the passed rectangle
314     virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r );
315 
316     // appends 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)
317     virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ;
318 
319     // appends an ellipse
320     virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
321 
322     // appends a rounded rectangle
323     virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius);
324 
325     // returns the native path
326     virtual void * GetNativePath() const = 0;
327 
328     // give the native path returned by GetNativePath() back (there might be some deallocations necessary)
329     virtual void UnGetNativePath(void *p) const= 0;
330 
331     // transforms each point of this path by the matrix
332     virtual void Transform( const wxGraphicsMatrixData* matrix ) =0;
333 
334     // gets the bounding box enclosing all points (possibly including control points)
335     virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const=0;
336 
337     virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE) const=0;
338 };
339 
340 class WXDLLIMPEXP_CORE wxGraphicsPath : public wxGraphicsObject
341 {
342 public :
wxGraphicsPath()343     wxGraphicsPath()  {}
344 #if wxABI_VERSION >= 20810
wxGraphicsPath(const wxGraphicsPath & other)345     wxGraphicsPath( const wxGraphicsPath& other) : wxGraphicsObject( other ) {}
346     wxGraphicsPath& operator= (const wxGraphicsPath & other) { Ref(other); return *this;}
347 #endif
~wxGraphicsPath()348     virtual ~wxGraphicsPath() {}
349 
350     //
351     // These are the path primitives from which everything else can be constructed
352     //
353 
354     // begins a new subpath at (x,y)
355     virtual void MoveToPoint( wxDouble x, wxDouble y );
356     void MoveToPoint( const wxPoint2DDouble& p);
357 
358     // adds a straight line from the current point to (x,y)
359     virtual void AddLineToPoint( wxDouble x, wxDouble y );
360     void AddLineToPoint( const wxPoint2DDouble& p);
361 
362     // adds a cubic Bezier curve from the current point, using two control points and an end point
363     virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) ;
364     void AddCurveToPoint( const wxPoint2DDouble& c1, const wxPoint2DDouble& c2, const wxPoint2DDouble& e);
365 
366     // adds another path
367     virtual void AddPath( const wxGraphicsPath& path );
368 
369     // closes the current sub-path
370     virtual void CloseSubpath() ;
371 
372     // gets the last point of the current path, (0,0) if not yet set
373     virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const;
374     wxPoint2DDouble GetCurrentPoint() const;
375 
376     // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle
377     virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) ;
378     void AddArc( const wxPoint2DDouble& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise);
379 
380     //
381     // These are convenience functions which - if not available natively will be assembled
382     // using the primitives from above
383     //
384 
385     // adds a quadratic Bezier curve from the current point, using a control point and an end point
386     virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y );
387 
388     // appends a rectangle as a new closed subpath
389     virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h );
390 
391     // appends an ellipsis as a new closed subpath fitting the passed rectangle
392     virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r );
393 
394     // appends 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)
395     virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ;
396 
397     // appends an ellipse
398     virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
399 
400     // appends a rounded rectangle
401     virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius);
402 
403     // returns the native path
404     virtual void * GetNativePath() const;
405 
406     // give the native path returned by GetNativePath() back (there might be some deallocations necessary)
407     virtual void UnGetNativePath(void *p)const;
408 
409     // transforms each point of this path by the matrix
410     virtual void Transform( const wxGraphicsMatrix& matrix );
411 
412     // gets the bounding box enclosing all points (possibly including control points)
413     virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h)const;
414     wxRect2DDouble GetBox()const;
415 
416     virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE)const;
417     bool Contains( const wxPoint2DDouble& c, int fillStyle = wxODDEVEN_RULE)const;
418 
GetPathData()419     const wxGraphicsPathData* GetPathData() const
420     { return (const wxGraphicsPathData*) GetRefData(); }
GetPathData()421     wxGraphicsPathData* GetPathData()
422     { return (wxGraphicsPathData*) GetRefData(); }
423 
424 private :
425     DECLARE_DYNAMIC_CLASS(wxGraphicsPath)
426 } ;
427 
428 extern WXDLLEXPORT_DATA(wxGraphicsPath) wxNullGraphicsPath;
429 
430 
431 class WXDLLIMPEXP_CORE wxGraphicsContext : public wxGraphicsObject
432 {
433 public:
434     wxGraphicsContext(wxGraphicsRenderer* renderer);
435 
436     virtual ~wxGraphicsContext();
437 
438     static wxGraphicsContext* Create( const wxWindowDC& dc) ;
439 
440 #ifdef __WXMSW__
441     static wxGraphicsContext * Create( const wxMemoryDC& dc) ;
442 #endif
443 
444     static wxGraphicsContext* CreateFromNative( void * context ) ;
445 
446     static wxGraphicsContext* CreateFromNativeWindow( void * window ) ;
447 
448     static wxGraphicsContext* Create( wxWindow* window ) ;
449 
450     // create a context that can be used for measuring texts only, no drawing allowed
451     static wxGraphicsContext * Create();
452 
453     wxGraphicsPath CreatePath() const;
454 
455     virtual wxGraphicsPen CreatePen(const wxPen& pen) const;
456 
457     virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) const;
458 
459     // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
460     virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
461         const wxColour&c1, const wxColour&c2) const;
462 
463     // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc)
464     // with radius r and color cColor
465     virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
466         const wxColour &oColor, const wxColour &cColor) const;
467 
468     // sets the font
469     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const;
470 
471 #if wxABI_VERSION >= 20809
472     wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) const;
473 #endif
474 
475     //virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h  ) const;
476 
477     // create a 'native' matrix corresponding to these values
478     virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
479         wxDouble tx=0.0, wxDouble ty=0.0) const;
480 
481     // push the current state of the context, ie the transformation matrix on a stack
482     virtual void PushState() = 0;
483 
484     // pops a stored state from the stack
485     virtual void PopState() = 0;
486 
487     // clips drawings to the region intersected with the current clipping region
488     virtual void Clip( const wxRegion &region ) = 0;
489 
490     // clips drawings to the rect intersected with the current clipping region
491     virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
492 
493     // resets the clipping to original extent
494     virtual void ResetClip() = 0 ;
495 
496     // returns the native context
497     virtual void * GetNativeContext() = 0;
498 
499     // returns the current logical function
GetLogicalFunction()500     virtual int GetLogicalFunction() const { return m_logicalFunction; }
501 
502     // sets the current logical function, returns true if it supported
503     virtual bool SetLogicalFunction(int function) ;
504 
505     //
506     // transformation : changes the current transformation matrix CTM of the context
507     //
508 
509     // translate
510     virtual void Translate( wxDouble dx , wxDouble dy ) = 0;
511 
512     // scale
513     virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0;
514 
515     // rotate (radians)
516     virtual void Rotate( wxDouble angle ) = 0;
517 
518     // concatenates this transform with the current transform of this context
519     virtual void ConcatTransform( const wxGraphicsMatrix& matrix ) = 0;
520 
521     // sets the transform of this context
522     virtual void SetTransform( const wxGraphicsMatrix& matrix ) = 0;
523 
524     // gets the matrix of this context
525     virtual wxGraphicsMatrix GetTransform() const = 0;
526     //
527     // setting the paint
528     //
529 
530     // sets the pen
531     virtual void SetPen( const wxGraphicsPen& pen );
532 
533     void SetPen( const wxPen& pen );
534 
535     // sets the brush for filling
536     virtual void SetBrush( const wxGraphicsBrush& brush );
537 
538     void SetBrush( const wxBrush& brush );
539 
540     // sets the font
541     virtual void SetFont( const wxGraphicsFont& font );
542 
543     void SetFont( const wxFont& font, const wxColour& colour );
544 
545 
546     // strokes along a path with the current pen
547     virtual void StrokePath( const wxGraphicsPath& path ) = 0;
548 
549     // fills a path with the current brush
550     virtual void FillPath( const wxGraphicsPath& path, int fillStyle = wxODDEVEN_RULE ) = 0;
551 
552     // draws a path by first filling and then stroking
553     virtual void DrawPath( const wxGraphicsPath& path, int fillStyle = wxODDEVEN_RULE );
554 
555     //
556     // text
557     //
558 
559     virtual void DrawText( const wxString &str, wxDouble x, wxDouble y ) = 0;
560 
561     virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle );
562 
563     virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, const wxGraphicsBrush& backgroundBrush ) ;
564 
565     virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle, const wxGraphicsBrush& backgroundBrush );
566 
567     virtual void GetTextExtent( const wxString &text, wxDouble *width, wxDouble *height,
568         wxDouble *descent, wxDouble *externalLeading ) const  = 0;
569 
570     virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const = 0;
571 
572     //
573     // image support
574     //
575 #if wxABI_VERSION >= 20809
576     void DrawGraphicsBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h );
577 #endif
578 
579     virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
580 
581     virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
582 
583     //
584     // convenience methods
585     //
586 
587     // strokes a single line
588     virtual void StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2);
589 
590     // stroke lines connecting each of the points
591     virtual void StrokeLines( size_t n, const wxPoint2DDouble *points);
592 
593     // stroke disconnected lines from begin to end points
594     virtual void StrokeLines( size_t n, const wxPoint2DDouble *beginPoints, const wxPoint2DDouble *endPoints);
595 
596     // draws a polygon
597     virtual void DrawLines( size_t n, const wxPoint2DDouble *points, int fillStyle = wxODDEVEN_RULE );
598 
599     // draws a polygon
600     virtual void DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
601 
602     // draws an ellipse
603     virtual void DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
604 
605     // draws a rounded rectangle
606     virtual void DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius);
607 
608      // wrappers using wxPoint2DDouble TODO
609 
610     // helper to determine if a 0.5 offset should be applied for the drawing operation
ShouldOffset()611     virtual bool ShouldOffset() const { return false; }
612 
613 protected :
614 
615     wxGraphicsPen m_pen;
616     wxGraphicsBrush m_brush;
617     wxGraphicsFont m_font;
618     int m_logicalFunction;
619 
620 private :
621     DECLARE_NO_COPY_CLASS(wxGraphicsContext)
622     DECLARE_ABSTRACT_CLASS(wxGraphicsContext)
623 };
624 
625 #if 0
626 
627 //
628 // A graphics figure allows to cache path, pen etc creations, also will be a basis for layering/grouping elements
629 //
630 
631 class WXDLLIMPEXP_CORE wxGraphicsFigure : public wxGraphicsObject
632 {
633 public :
634     wxGraphicsFigure(wxGraphicsRenderer* renderer) ;
635 #if wxABI_VERSION >= 20810
636     wxGraphicsFigure( const wxGraphicsFigure& other) : wxGraphicsObject( other ) {}
637     wxGraphicsFigure& operator= (const wxGraphicsFigure & other) { Ref(other); return *this;}
638 #endif
639 
640     virtual ~wxGraphicsFigure() ;
641 
642     void SetPath( wxGraphicsMatrix* matrix );
643 
644     void SetMatrix( wxGraphicsPath* path);
645 
646     // draws this object on the context
647     virtual void Draw( wxGraphicsContext* cg );
648 
649     // returns the path of this object
650     wxGraphicsPath* GetPath() { return m_path; }
651 
652     // returns the transformation matrix of this object, may be null if there is no transformation necessary
653     wxGraphicsMatrix* GetMatrix() { return m_matrix; }
654 
655 private :
656     wxGraphicsMatrix* m_matrix;
657     wxGraphicsPath* m_path;
658 
659     DECLARE_DYNAMIC_CLASS(wxGraphicsFigure)
660 } ;
661 
662 #endif
663 
664 //
665 // The graphics renderer is the instance corresponding to the rendering engine used, eg there is ONE core graphics renderer
666 // instance on OSX. This instance is pointed back to by all objects created by it. Therefore you can create eg additional
667 // paths at any point from a given matrix etc.
668 //
669 
670 class WXDLLIMPEXP_CORE wxGraphicsRenderer : public wxObject
671 {
672 public :
wxGraphicsRenderer()673     wxGraphicsRenderer() {}
674 
~wxGraphicsRenderer()675     virtual ~wxGraphicsRenderer() {}
676 
677     static wxGraphicsRenderer* GetDefaultRenderer();
678 
679 #if wxABI_VERSION >= 20811
680     static wxGraphicsRenderer* GetCairoRenderer();
681 #endif
682     // Context
683 
684     virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc) = 0 ;
685 #ifdef __WXMSW__
686     virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc) = 0 ;
687 #endif
688     virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ) = 0;
689 
690     virtual wxGraphicsContext * CreateContextFromNativeWindow( void * window ) = 0;
691 
692     virtual wxGraphicsContext * CreateContext( wxWindow* window ) = 0;
693 
694     // create a context that can be used for measuring texts only, no drawing allowed
695     virtual wxGraphicsContext * CreateMeasuringContext() = 0;
696 
697     // Path
698 
699     virtual wxGraphicsPath CreatePath() = 0;
700 
701     // Matrix
702 
703     virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
704         wxDouble tx=0.0, wxDouble ty=0.0) = 0;
705 
706     // Paints
707 
708     virtual wxGraphicsPen CreatePen(const wxPen& pen) = 0 ;
709 
710     virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) = 0 ;
711 
712     // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
713     virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
714         const wxColour&c1, const wxColour&c2) = 0;
715 
716     // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc)
717     // with radius r and color cColor
718     virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
719         const wxColour &oColor, const wxColour &cColor) = 0;
720 
721    // sets the font
722     virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0;
723 
724 #if wxABI_VERSION >= 20809
725     wxGraphicsBitmap CreateBitmap( const wxBitmap &bmp );
726 #endif
727 
728 private :
729     DECLARE_NO_COPY_CLASS(wxGraphicsRenderer)
730     DECLARE_ABSTRACT_CLASS(wxGraphicsRenderer)
731 } ;
732 
733 #endif
734 
735 #endif // _WX_GRAPHICS_H_
736