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