]> git.saurik.com Git - wxWidgets.git/blame - include/wx/graphics.h
Fix huge performance problem in wxStdInputStream when using MSVC8/9.
[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
f07d9b97
MR
15#include "wx/defs.h"
16
8acd14d1
SC
17#if wxUSE_GRAPHICS_CONTEXT
18
50581042 19#include "wx/geometry.h"
50581042 20#include "wx/dynarray.h"
79bd5e98 21#include "wx/dc.h"
08b2d55f 22#include "wx/image.h"
4ee4c7b9 23#include "wx/vector.h"
50581042 24
bf02a7f9
SC
25enum wxAntialiasMode
26{
27 wxANTIALIAS_NONE, // should be 0
8b982755 28 wxANTIALIAS_DEFAULT
bf02a7f9
SC
29};
30
133cb28b
SC
31enum wxInterpolationQuality
32{
3399af21
SC
33 // default interpolation
34 wxINTERPOLATION_DEFAULT,
133cb28b 35 // no interpolation
3399af21 36 wxINTERPOLATION_NONE,
133cb28b
SC
37 // fast interpolation, suited for interactivity
38 wxINTERPOLATION_FAST,
39 // better quality
40 wxINTERPOLATION_GOOD,
41 // best quality, not suited for interactivity
42 wxINTERPOLATION_BEST
43};
44
bf02a7f9
SC
45enum wxCompositionMode
46{
47 // R = Result, S = Source, D = Destination, premultiplied with alpha
48 // Ra, Sa, Da their alpha components
03647350 49
bf02a7f9
SC
50 // classic Porter-Duff compositions
51 // http://keithp.com/~keithp/porterduff/p253-porter.pdf
03647350 52
fec4e458 53 wxCOMPOSITION_INVALID = -1, /* indicates invalid/unsupported mode */
bf02a7f9
SC
54 wxCOMPOSITION_CLEAR, /* R = 0 */
55 wxCOMPOSITION_SOURCE, /* R = S */
56 wxCOMPOSITION_OVER, /* R = S + D*(1 - Sa) */
57 wxCOMPOSITION_IN, /* R = S*Da */
58 wxCOMPOSITION_OUT, /* R = S*(1 - Da) */
59 wxCOMPOSITION_ATOP, /* R = S*Da + D*(1 - Sa) */
60
61 wxCOMPOSITION_DEST, /* R = D, essentially a noop */
62 wxCOMPOSITION_DEST_OVER, /* R = S*(1 - Da) + D */
63 wxCOMPOSITION_DEST_IN, /* R = D*Sa */
64 wxCOMPOSITION_DEST_OUT, /* R = D*(1 - Sa) */
65 wxCOMPOSITION_DEST_ATOP, /* R = S*(1 - Da) + D*Sa */
66 wxCOMPOSITION_XOR, /* R = S*(1 - Da) + D*(1 - Sa) */
03647350 67
bf02a7f9 68 // mathematical compositions
bbd783e0 69 wxCOMPOSITION_ADD /* R = S + D */
bf02a7f9
SC
70};
71
b5dbe15d
VS
72class WXDLLIMPEXP_FWD_CORE wxWindowDC;
73class WXDLLIMPEXP_FWD_CORE wxMemoryDC;
220d37c8 74#if wxUSE_PRINTING_ARCHITECTURE
0b822969 75class WXDLLIMPEXP_FWD_CORE wxPrinterDC;
c929ad91 76#endif
29188693 77#ifdef __WXMSW__
c929ad91 78#if wxUSE_ENH_METAFILE
8371a353 79class WXDLLIMPEXP_FWD_CORE wxEnhMetaFileDC;
220d37c8 80#endif
29188693 81#endif
b5dbe15d
VS
82class WXDLLIMPEXP_FWD_CORE wxGraphicsContext;
83class WXDLLIMPEXP_FWD_CORE wxGraphicsPath;
84class WXDLLIMPEXP_FWD_CORE wxGraphicsMatrix;
85class WXDLLIMPEXP_FWD_CORE wxGraphicsFigure;
86class WXDLLIMPEXP_FWD_CORE wxGraphicsRenderer;
87class WXDLLIMPEXP_FWD_CORE wxGraphicsPen;
88class WXDLLIMPEXP_FWD_CORE wxGraphicsBrush;
89class WXDLLIMPEXP_FWD_CORE wxGraphicsFont;
1796d384 90class WXDLLIMPEXP_FWD_CORE wxGraphicsBitmap;
774f4d12 91
50581042
SC
92/*
93 * notes about the graphics context apis
94 *
0b7dce54 95 * angles : are measured in radians, 0.0 being in direction of positiv x axis, PI/2 being
50581042
SC
96 * in direction of positive y axis.
97 */
0b7dce54 98
9e605538 99// Base class of all objects used for drawing in the new graphics API, the always point back to their
0b7dce54 100// originating rendering engine, there is no dynamic unloading of a renderer currently allowed,
9e605538 101// these references are not counted
2c820406
SC
102
103//
104// The data used by objects like graphics pens etc is ref counted, in order to avoid unnecessary expensive
105// duplication. Any operation on a shared instance that results in a modified state, uncouples this
106// instance from the other instances that were shared - using copy on write semantics
107//
0b7dce54 108
3c419e81
SC
109class WXDLLIMPEXP_FWD_CORE wxGraphicsObjectRefData;
110class WXDLLIMPEXP_FWD_CORE wxGraphicsMatrixData;
111class WXDLLIMPEXP_FWD_CORE wxGraphicsPathData;
2c820406 112
9e605538
SC
113class WXDLLIMPEXP_CORE wxGraphicsObject : public wxObject
114{
0b7dce54
VZ
115public:
116 wxGraphicsObject();
117 wxGraphicsObject( wxGraphicsRenderer* renderer );
118 virtual ~wxGraphicsObject();
119
120 bool IsNull() const;
2c820406
SC
121
122 // returns the renderer that was used to create this instance, or NULL if it has not been initialized yet
0b7dce54
VZ
123 wxGraphicsRenderer* GetRenderer() const;
124 wxGraphicsObjectRefData* GetGraphicsData() const;
125protected:
2c820406
SC
126 virtual wxObjectRefData* CreateRefData() const;
127 virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const;
128
39013ba0 129 DECLARE_DYNAMIC_CLASS(wxGraphicsObject)
0b7dce54 130};
9e605538
SC
131
132class WXDLLIMPEXP_CORE wxGraphicsPen : public wxGraphicsObject
133{
0b7dce54 134public:
2c820406 135 wxGraphicsPen() {}
9e605538 136 virtual ~wxGraphicsPen() {}
0b7dce54 137private:
2c820406 138 DECLARE_DYNAMIC_CLASS(wxGraphicsPen)
0b7dce54 139};
9e605538 140
53a2db12 141extern WXDLLIMPEXP_DATA_CORE(wxGraphicsPen) wxNullGraphicsPen;
2c820406 142
9e605538
SC
143class WXDLLIMPEXP_CORE wxGraphicsBrush : public wxGraphicsObject
144{
0b7dce54 145public:
2c820406 146 wxGraphicsBrush() {}
9e605538 147 virtual ~wxGraphicsBrush() {}
0b7dce54 148private:
2c820406 149 DECLARE_DYNAMIC_CLASS(wxGraphicsBrush)
0b7dce54 150};
9e605538 151
53a2db12 152extern WXDLLIMPEXP_DATA_CORE(wxGraphicsBrush) wxNullGraphicsBrush;
2c820406 153
9e605538 154class WXDLLIMPEXP_CORE wxGraphicsFont : public wxGraphicsObject
50581042 155{
0b7dce54 156public:
2c820406 157 wxGraphicsFont() {}
9e605538 158 virtual ~wxGraphicsFont() {}
0b7dce54 159private:
2c820406 160 DECLARE_DYNAMIC_CLASS(wxGraphicsFont)
0b7dce54 161};
9e605538 162
53a2db12 163extern WXDLLIMPEXP_DATA_CORE(wxGraphicsFont) wxNullGraphicsFont;
2c820406 164
1796d384
SC
165class WXDLLIMPEXP_CORE wxGraphicsBitmap : public wxGraphicsObject
166{
0b7dce54 167public:
1796d384
SC
168 wxGraphicsBitmap() {}
169 virtual ~wxGraphicsBitmap() {}
08b2d55f
VZ
170
171 // Convert bitmap to wxImage: this is more efficient than converting to
172 // wxBitmap first and then to wxImage and also works without X server
173 // connection under Unix that wxBitmap requires.
174#if wxUSE_IMAGE
175 wxImage ConvertToImage() const;
176#endif // wxUSE_IMAGE
177
0b7dce54 178private:
1796d384 179 DECLARE_DYNAMIC_CLASS(wxGraphicsBitmap)
0b7dce54
VZ
180};
181
53a2db12 182extern WXDLLIMPEXP_DATA_CORE(wxGraphicsBitmap) wxNullGraphicsBitmap;
1796d384 183
a4e73390
SC
184class WXDLLIMPEXP_CORE wxGraphicsMatrix : public wxGraphicsObject
185{
0b7dce54 186public:
a4e73390
SC
187 wxGraphicsMatrix() {}
188
189 virtual ~wxGraphicsMatrix() {}
190
191 // concatenates the matrix
192 virtual void Concat( const wxGraphicsMatrix *t );
193 void Concat( const wxGraphicsMatrix &t ) { Concat( &t ); }
194
195 // sets the matrix to the respective values
0b7dce54 196 virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
a4e73390
SC
197 wxDouble tx=0.0, wxDouble ty=0.0);
198
248802d0
RD
199 // gets the component valuess of the matrix
200 virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL,
201 wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const;
0b7dce54 202
a4e73390
SC
203 // makes this the inverse matrix
204 virtual void Invert();
205
206 // returns true if the elements of the transformation matrix are equal ?
207 virtual bool IsEqual( const wxGraphicsMatrix* t) const;
208 bool IsEqual( const wxGraphicsMatrix& t) const { return IsEqual( &t ); }
209
210 // return true if this is the identity matrix
211 virtual bool IsIdentity() const;
212
213 //
214 // transformation
215 //
216
217 // add the translation to this matrix
218 virtual void Translate( wxDouble dx , wxDouble dy );
219
220 // add the scale to this matrix
221 virtual void Scale( wxDouble xScale , wxDouble yScale );
222
223 // add the rotation to this matrix (radians)
0b7dce54 224 virtual void Rotate( wxDouble angle );
a4e73390
SC
225
226 //
227 // apply the transforms
228 //
229
230 // applies that matrix to the point
231 virtual void TransformPoint( wxDouble *x, wxDouble *y ) const;
232
233 // applies the matrix except for translations
234 virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const;
235
236 // returns the native representation
237 virtual void * GetNativeMatrix() const;
238
0b7dce54 239 const wxGraphicsMatrixData* GetMatrixData() const
a4e73390 240 { return (const wxGraphicsMatrixData*) GetRefData(); }
0b7dce54 241 wxGraphicsMatrixData* GetMatrixData()
a4e73390
SC
242 { return (wxGraphicsMatrixData*) GetRefData(); }
243
0b7dce54 244private:
a4e73390 245 DECLARE_DYNAMIC_CLASS(wxGraphicsMatrix)
0b7dce54 246};
a4e73390 247
53a2db12 248extern WXDLLIMPEXP_DATA_CORE(wxGraphicsMatrix) wxNullGraphicsMatrix;
a4e73390 249
a4e73390 250class WXDLLIMPEXP_CORE wxGraphicsPath : public wxGraphicsObject
774f4d12 251{
0b7dce54 252public:
a4e73390
SC
253 wxGraphicsPath() {}
254 virtual ~wxGraphicsPath() {}
0b7dce54 255
a4e73390
SC
256 //
257 // These are the path primitives from which everything else can be constructed
258 //
9e605538 259
a4e73390
SC
260 // begins a new subpath at (x,y)
261 virtual void MoveToPoint( wxDouble x, wxDouble y );
262 void MoveToPoint( const wxPoint2DDouble& p);
0d3675a6 263
0b7dce54 264 // adds a straight line from the current point to (x,y)
a4e73390
SC
265 virtual void AddLineToPoint( wxDouble x, wxDouble y );
266 void AddLineToPoint( const wxPoint2DDouble& p);
0d3675a6 267
a4e73390 268 // adds a cubic Bezier curve from the current point, using two control points and an end point
0b7dce54 269 virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y );
a4e73390 270 void AddCurveToPoint( const wxPoint2DDouble& c1, const wxPoint2DDouble& c2, const wxPoint2DDouble& e);
0b7dce54 271
a4e73390
SC
272 // adds another path
273 virtual void AddPath( const wxGraphicsPath& path );
274
275 // closes the current sub-path
0b7dce54 276 virtual void CloseSubpath();
a4e73390
SC
277
278 // gets the last point of the current path, (0,0) if not yet set
279 virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const;
280 wxPoint2DDouble GetCurrentPoint() const;
281
282 // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle
0b7dce54 283 virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise );
a4e73390
SC
284 void AddArc( const wxPoint2DDouble& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise);
285
774f4d12 286 //
0b7dce54 287 // These are convenience functions which - if not available natively will be assembled
a4e73390 288 // using the primitives from above
774f4d12 289 //
a4e73390
SC
290
291 // adds a quadratic Bezier curve from the current point, using a control point and an end point
292 virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y );
293
0b7dce54 294 // appends a rectangle as a new closed subpath
a4e73390
SC
295 virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h );
296
297 // appends an ellipsis as a new closed subpath fitting the passed rectangle
298 virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r );
299
300 // 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)
0b7dce54
VZ
301 virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r );
302
a4e73390
SC
303 // appends an ellipse
304 virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
774f4d12 305
a4e73390
SC
306 // appends a rounded rectangle
307 virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius);
774f4d12 308
a4e73390
SC
309 // returns the native path
310 virtual void * GetNativePath() const;
0b7dce54 311
a4e73390
SC
312 // give the native path returned by GetNativePath() back (there might be some deallocations necessary)
313 virtual void UnGetNativePath(void *p)const;
0b7dce54 314
a4e73390
SC
315 // transforms each point of this path by the matrix
316 virtual void Transform( const wxGraphicsMatrix& matrix );
0b7dce54 317
a4e73390
SC
318 // gets the bounding box enclosing all points (possibly including control points)
319 virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h)const;
320 wxRect2DDouble GetBox()const;
0b7dce54 321
94a007ec
FM
322 virtual bool Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle = wxODDEVEN_RULE)const;
323 bool Contains( const wxPoint2DDouble& c, wxPolygonFillMode fillStyle = wxODDEVEN_RULE)const;
0b7dce54
VZ
324
325 const wxGraphicsPathData* GetPathData() const
a4e73390 326 { return (const wxGraphicsPathData*) GetRefData(); }
0b7dce54 327 wxGraphicsPathData* GetPathData()
a4e73390
SC
328 { return (wxGraphicsPathData*) GetRefData(); }
329
0b7dce54 330private:
a4e73390 331 DECLARE_DYNAMIC_CLASS(wxGraphicsPath)
0b7dce54 332};
774f4d12 333
53a2db12 334extern WXDLLIMPEXP_DATA_CORE(wxGraphicsPath) wxNullGraphicsPath;
a4e73390
SC
335
336
4ee4c7b9
VZ
337// Describes a single gradient stop.
338class wxGraphicsGradientStop
339{
340public:
2028c33a
VZ
341 wxGraphicsGradientStop(wxColour col = wxTransparentColour,
342 float pos = 0.)
4ee4c7b9
VZ
343 : m_col(col),
344 m_pos(pos)
345 {
346 }
347
348 // default copy ctor, assignment operator and dtor are ok
349
350 const wxColour& GetColour() const { return m_col; }
351 void SetColour(const wxColour& col) { m_col = col; }
352
353 float GetPosition() const { return m_pos; }
354 void SetPosition(float pos)
355 {
3784bf30 356 wxASSERT_MSG( pos >= 0 && pos <= 1, "invalid gradient stop position" );
4ee4c7b9
VZ
357
358 m_pos = pos;
359 }
360
361private:
362 // The colour of this gradient band.
363 wxColour m_col;
364
365 // Its starting position: 0 is the beginning and 1 is the end.
366 float m_pos;
367};
368
369// A collection of gradient stops ordered by their positions (from lowest to
370// highest). The first stop (index 0, position 0.0) is always the starting
371// colour and the last one (index GetCount() - 1, position 1.0) is the end
372// colour.
373class WXDLLIMPEXP_CORE wxGraphicsGradientStops
374{
375public:
376 wxGraphicsGradientStops(wxColour startCol = wxTransparentColour,
377 wxColour endCol = wxTransparentColour)
378 {
379 // we can't use Add() here as it relies on having start/end stops as
380 // first/last array elements so do it manually
7d53220e
SC
381 m_stops.push_back(wxGraphicsGradientStop(startCol, 0.f));
382 m_stops.push_back(wxGraphicsGradientStop(endCol, 1.f));
4ee4c7b9
VZ
383 }
384
385 // default copy ctor, assignment operator and dtor are ok for this class
386
387
388 // Add a stop in correct order.
389 void Add(const wxGraphicsGradientStop& stop);
390 void Add(wxColour col, float pos) { Add(wxGraphicsGradientStop(col, pos)); }
391
392 // Get the number of stops.
393 unsigned GetCount() const { return m_stops.size(); }
394
395 // Return the stop at the given index (which must be valid).
396 wxGraphicsGradientStop Item(unsigned n) const { return m_stops.at(n); }
397
398 // Get/set start and end colours.
399 void SetStartColour(wxColour col)
400 { m_stops[0].SetColour(col); }
401 wxColour GetStartColour() const
402 { return m_stops[0].GetColour(); }
403 void SetEndColour(wxColour col)
404 { m_stops[m_stops.size() - 1].SetColour(col); }
405 wxColour GetEndColour() const
406 { return m_stops[m_stops.size() - 1].GetColour(); }
407
408private:
409 // All the stops stored in ascending order of positions.
410 wxVector<wxGraphicsGradientStop> m_stops;
411};
412
9e605538 413class WXDLLIMPEXP_CORE wxGraphicsContext : public wxGraphicsObject
50581042
SC
414{
415public:
9e605538 416 wxGraphicsContext(wxGraphicsRenderer* renderer);
774f4d12 417
9e605538 418 virtual ~wxGraphicsContext();
0b7dce54
VZ
419
420 static wxGraphicsContext* Create( const wxWindowDC& dc);
421 static wxGraphicsContext * Create( const wxMemoryDC& dc);
220d37c8 422#if wxUSE_PRINTING_ARCHITECTURE
0b7dce54 423 static wxGraphicsContext * Create( const wxPrinterDC& dc);
c929ad91 424#endif
29188693 425#ifdef __WXMSW__
c929ad91 426#if wxUSE_ENH_METAFILE
8371a353 427 static wxGraphicsContext * Create( const wxEnhMetaFileDC& dc);
29188693 428#endif
220d37c8 429#endif
773ccc31 430
0b7dce54 431 static wxGraphicsContext* CreateFromNative( void * context );
774f4d12 432
0b7dce54 433 static wxGraphicsContext* CreateFromNativeWindow( void * window );
9a02779a 434
0b7dce54 435 static wxGraphicsContext* Create( wxWindow* window );
50581042 436
0a470e5e
VZ
437#if wxUSE_IMAGE
438 // Create a context for drawing onto a wxImage. The image life time must be
439 // greater than that of the context itself as when the context is destroyed
440 // it will copy its contents to the specified image.
441 static wxGraphicsContext* Create(wxImage& image);
442#endif // wxUSE_IMAGE
443
ad667945
SC
444 // create a context that can be used for measuring texts only, no drawing allowed
445 static wxGraphicsContext * Create();
446
cc18b1c7 447 // begin a new document (relevant only for printing / pdf etc) if there is a progress dialog, message will be shown
0b7dce54
VZ
448 virtual bool StartDoc( const wxString& message );
449
450 // done with that document (relevant only for printing / pdf etc)
cc18b1c7
SC
451 virtual void EndDoc();
452
0b7dce54 453 // opens a new page (relevant only for printing / pdf etc) with the given size in points
cc18b1c7
SC
454 // (if both are null the default page size will be used)
455 virtual void StartPage( wxDouble width = 0, wxDouble height = 0 );
0b7dce54
VZ
456
457 // ends the current page (relevant only for printing / pdf etc)
cc18b1c7 458 virtual void EndPage();
0b7dce54 459
cc18b1c7
SC
460 // make sure that the current content of this context is immediately visible
461 virtual void Flush();
462
a4e73390 463 wxGraphicsPath CreatePath() const;
0b7dce54 464
a4e73390 465 virtual wxGraphicsPen CreatePen(const wxPen& pen) const;
0b7dce54 466
a4e73390 467 virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) const;
0b7dce54 468
4ee4c7b9
VZ
469 // sets the brush to a linear gradient, starting at (x1,y1) and ending at
470 // (x2,y2) with the given boundary colours or the specified stops
471 wxGraphicsBrush
472 CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
473 wxDouble x2, wxDouble y2,
474 const wxColour& c1, const wxColour& c2) const;
475 wxGraphicsBrush
476 CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
477 wxDouble x2, wxDouble y2,
478 const wxGraphicsGradientStops& stops) const;
479
480 // sets the brush to a radial gradient originating at (xo,yc) and ending
481 // on a circle around (xc,yc) with the given radius; the colours may be
482 // specified by just the two extremes or the full array of gradient stops
483 wxGraphicsBrush
484 CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
485 wxDouble xc, wxDouble yc, wxDouble radius,
486 const wxColour& oColor, const wxColour& cColor) const;
487
488 wxGraphicsBrush
489 CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
490 wxDouble xc, wxDouble yc, wxDouble radius,
491 const wxGraphicsGradientStops& stops) const;
9e605538 492
fa378d36 493 // creates a font
a4e73390 494 virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const;
fa378d36
VZ
495 virtual wxGraphicsFont CreateFont(double sizeInPixels,
496 const wxString& facename,
497 int flags = wxFONTFLAG_DEFAULT,
498 const wxColour& col = *wxBLACK) const;
9e605538 499
1796d384
SC
500 // create a native bitmap representation
501 virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) const;
0a470e5e
VZ
502#if wxUSE_IMAGE
503 wxGraphicsBitmap CreateBitmapFromImage(const wxImage& image) const;
504#endif // wxUSE_IMAGE
0b7dce54 505
1796d384
SC
506 // create a native bitmap representation
507 virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) const;
508
0d3675a6 509 // create a 'native' matrix corresponding to these values
0b7dce54 510 virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
a4e73390 511 wxDouble tx=0.0, wxDouble ty=0.0) const;
0b7dce54 512
50581042
SC
513 // push the current state of the context, ie the transformation matrix on a stack
514 virtual void PushState() = 0;
515
516 // pops a stored state from the stack
517 virtual void PopState() = 0;
518
cc18b1c7 519 // clips drawings to the region intersected with the current clipping region
50581042
SC
520 virtual void Clip( const wxRegion &region ) = 0;
521
cc18b1c7 522 // clips drawings to the rect intersected with the current clipping region
774f4d12 523 virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
0b7dce54 524
0d3675a6 525 // resets the clipping to original extent
0b7dce54 526 virtual void ResetClip() = 0;
774f4d12 527
0d3675a6
RD
528 // returns the native context
529 virtual void * GetNativeContext() = 0;
774f4d12 530
bf02a7f9
SC
531 // returns the current shape antialiasing mode
532 virtual wxAntialiasMode GetAntialiasMode() const { return m_antialias; }
03647350 533
bf02a7f9
SC
534 // sets the antialiasing mode, returns true if it supported
535 virtual bool SetAntialiasMode(wxAntialiasMode antialias) = 0;
0b7dce54 536
a173c813 537 // returns the current interpolation quality
133cb28b
SC
538 virtual wxInterpolationQuality GetInterpolationQuality() const { return m_interpolation; }
539
a173c813 540 // sets the interpolation quality, returns true if it supported
133cb28b
SC
541 virtual bool SetInterpolationQuality(wxInterpolationQuality interpolation) = 0;
542
bf02a7f9
SC
543 // returns the current compositing operator
544 virtual wxCompositionMode GetCompositionMode() const { return m_composition; }
03647350 545
bf02a7f9
SC
546 // sets the compositing operator, returns true if it supported
547 virtual bool SetCompositionMode(wxCompositionMode op) = 0;
e22cf4b3 548
cc18b1c7 549 // returns the size of the graphics context in device coordinates
b129eaa3
VZ
550 void GetSize(wxDouble* width, wxDouble* height)
551 {
552 if ( width )
553 *width = m_width;
554 if ( height )
555 *height = m_height;
556 }
cc18b1c7
SC
557
558 // returns the resolution of the graphics context in device points per inch
559 virtual void GetDPI( wxDouble* dpiX, wxDouble* dpiY);
0b7dce54 560
cc18b1c7
SC
561#if 0
562 // sets the current alpha on this context
563 virtual void SetAlpha( wxDouble alpha );
0b7dce54 564
cc18b1c7
SC
565 // returns the alpha on this context
566 virtual wxDouble GetAlpha() const;
567#endif
bf02a7f9
SC
568
569 // all rendering is done into a fully transparent temporary context
570 virtual void BeginLayer(wxDouble opacity) = 0;
571
03647350 572 // composites back the drawings into the context with the opacity given at
bf02a7f9
SC
573 // the BeginLayer call
574 virtual void EndLayer() = 0;
575
50581042 576 //
774f4d12 577 // transformation : changes the current transformation matrix CTM of the context
50581042 578 //
0b7dce54 579
50581042
SC
580 // translate
581 virtual void Translate( wxDouble dx , wxDouble dy ) = 0;
582
583 // scale
584 virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0;
585
586 // rotate (radians)
587 virtual void Rotate( wxDouble angle ) = 0;
0b7dce54 588
0d3675a6 589 // concatenates this transform with the current transform of this context
a4e73390 590 virtual void ConcatTransform( const wxGraphicsMatrix& matrix ) = 0;
9e605538 591
0d3675a6 592 // sets the transform of this context
a4e73390 593 virtual void SetTransform( const wxGraphicsMatrix& matrix ) = 0;
50581042 594
0d3675a6 595 // gets the matrix of this context
a4e73390 596 virtual wxGraphicsMatrix GetTransform() const = 0;
50581042
SC
597 //
598 // setting the paint
599 //
0b7dce54 600
9e605538 601 // sets the pen
2c820406 602 virtual void SetPen( const wxGraphicsPen& pen );
0b7dce54 603
9e605538 604 void SetPen( const wxPen& pen );
50581042
SC
605
606 // sets the brush for filling
2c820406 607 virtual void SetBrush( const wxGraphicsBrush& brush );
0b7dce54 608
9e605538 609 void SetBrush( const wxBrush& brush );
50581042
SC
610
611 // sets the font
2c820406 612 virtual void SetFont( const wxGraphicsFont& font );
0b7dce54 613
9e605538 614 void SetFont( const wxFont& font, const wxColour& colour );
0d3675a6 615
0b7dce54 616
50581042 617 // strokes along a path with the current pen
a4e73390 618 virtual void StrokePath( const wxGraphicsPath& path ) = 0;
50581042
SC
619
620 // fills a path with the current brush
94a007ec 621 virtual void FillPath( const wxGraphicsPath& path, wxPolygonFillMode fillStyle = wxODDEVEN_RULE ) = 0;
50581042
SC
622
623 // draws a path by first filling and then stroking
94a007ec 624 virtual void DrawPath( const wxGraphicsPath& path, wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
0b7dce54 625
50581042
SC
626 //
627 // text
628 //
50581042 629
0b7dce54
VZ
630 void DrawText( const wxString &str, wxDouble x, wxDouble y )
631 { DoDrawText(str, x, y); }
632
633 void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle )
634 { DoDrawRotatedText(str, x, y, angle); }
635
636 void DrawText( const wxString &str, wxDouble x, wxDouble y,
637 const wxGraphicsBrush& backgroundBrush )
638 { DoDrawFilledText(str, x, y, backgroundBrush); }
50581042 639
0b7dce54
VZ
640 void DrawText( const wxString &str, wxDouble x, wxDouble y,
641 wxDouble angle, const wxGraphicsBrush& backgroundBrush )
642 { DoDrawRotatedFilledText(str, x, y, angle, backgroundBrush); }
068eb463 643
068eb463 644
50581042 645 virtual void GetTextExtent( const wxString &text, wxDouble *width, wxDouble *height,
9bd36c6c 646 wxDouble *descent = NULL, wxDouble *externalLeading = NULL ) const = 0;
50581042
SC
647
648 virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const = 0;
649
650 //
651 // image support
652 //
653
1796d384
SC
654 virtual void DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
655
50581042
SC
656 virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
657
658 virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
659
660 //
661 // convenience methods
662 //
0b7dce54 663
50581042
SC
664 // strokes a single line
665 virtual void StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2);
666
667 // stroke lines connecting each of the points
668 virtual void StrokeLines( size_t n, const wxPoint2DDouble *points);
669
670 // stroke disconnected lines from begin to end points
671 virtual void StrokeLines( size_t n, const wxPoint2DDouble *beginPoints, const wxPoint2DDouble *endPoints);
672
673 // draws a polygon
94a007ec 674 virtual void DrawLines( size_t n, const wxPoint2DDouble *points, wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
50581042 675
bf02a7f9 676 // draws a rectangle
50581042
SC
677 virtual void DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
678
679 // draws an ellipse
680 virtual void DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
681
682 // draws a rounded rectangle
683 virtual void DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius);
684
9e605538 685 // wrappers using wxPoint2DDouble TODO
50581042 686
de3cb39f
RD
687 // helper to determine if a 0.5 offset should be applied for the drawing operation
688 virtual bool ShouldOffset() const { return false; }
0217cfa5
SC
689
690 // indicates whether the context should try to offset for pixel boundaries, this only makes sense on
691 // bitmap devices like screen, by default this is turned off
692 virtual void EnableOffset(bool enable = true);
693
694 void DisableOffset() { EnableOffset(false); }
695 bool OffsetEnabled() { return m_enableOffset; }
696
0b7dce54 697protected:
b129eaa3
VZ
698 // These fields must be initialized in the derived class ctors.
699 wxDouble m_width,
700 m_height;
9da34e21 701
2c820406
SC
702 wxGraphicsPen m_pen;
703 wxGraphicsBrush m_brush;
704 wxGraphicsFont m_font;
bf02a7f9
SC
705 wxAntialiasMode m_antialias;
706 wxCompositionMode m_composition;
133cb28b 707 wxInterpolationQuality m_interpolation;
0217cfa5 708 bool m_enableOffset;
9e605538 709
02fd8b9b 710protected:
0b7dce54
VZ
711 // implementations of overloaded public functions: we use different names
712 // for them to avoid the virtual function hiding problems in the derived
713 // classes
714 virtual void DoDrawText(const wxString& str, wxDouble x, wxDouble y) = 0;
715 virtual void DoDrawRotatedText(const wxString& str, wxDouble x, wxDouble y,
716 wxDouble angle);
717 virtual void DoDrawFilledText(const wxString& str, wxDouble x, wxDouble y,
718 const wxGraphicsBrush& backgroundBrush);
719 virtual void DoDrawRotatedFilledText(const wxString& str,
720 wxDouble x, wxDouble y,
721 wxDouble angle,
722 const wxGraphicsBrush& backgroundBrush);
723
c0c133e1 724 wxDECLARE_NO_COPY_CLASS(wxGraphicsContext);
8ddf8e82 725 DECLARE_ABSTRACT_CLASS(wxGraphicsContext)
50581042
SC
726};
727
0b7dce54 728#if 0
9e605538
SC
729
730//
731// A graphics figure allows to cache path, pen etc creations, also will be a basis for layering/grouping elements
732//
733
734class WXDLLIMPEXP_CORE wxGraphicsFigure : public wxGraphicsObject
735{
0b7dce54
VZ
736public:
737 wxGraphicsFigure(wxGraphicsRenderer* renderer);
738
739 virtual ~wxGraphicsFigure();
740
0d3675a6 741 void SetPath( wxGraphicsMatrix* matrix );
0b7dce54 742
0d3675a6
RD
743 void SetMatrix( wxGraphicsPath* path);
744
745 // draws this object on the context
746 virtual void Draw( wxGraphicsContext* cg );
0b7dce54 747
0d3675a6
RD
748 // returns the path of this object
749 wxGraphicsPath* GetPath() { return m_path; }
0b7dce54 750
0d3675a6
RD
751 // returns the transformation matrix of this object, may be null if there is no transformation necessary
752 wxGraphicsMatrix* GetMatrix() { return m_matrix; }
0b7dce54
VZ
753
754private:
0d3675a6
RD
755 wxGraphicsMatrix* m_matrix;
756 wxGraphicsPath* m_path;
0b7dce54 757
9e605538 758 DECLARE_DYNAMIC_CLASS(wxGraphicsFigure)
0b7dce54
VZ
759};
760
761#endif
9e605538
SC
762
763//
764// The graphics renderer is the instance corresponding to the rendering engine used, eg there is ONE core graphics renderer
765// instance on OSX. This instance is pointed back to by all objects created by it. Therefore you can create eg additional
766// paths at any point from a given matrix etc.
767//
768
769class WXDLLIMPEXP_CORE wxGraphicsRenderer : public wxObject
770{
0b7dce54 771public:
9e605538
SC
772 wxGraphicsRenderer() {}
773
774 virtual ~wxGraphicsRenderer() {}
775
0d3675a6 776 static wxGraphicsRenderer* GetDefaultRenderer();
9e605538 777
c0e69d72 778 static wxGraphicsRenderer* GetCairoRenderer();
0d3675a6 779 // Context
9e605538 780
0b7dce54
VZ
781 virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc) = 0;
782 virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc) = 0;
220d37c8 783#if wxUSE_PRINTING_ARCHITECTURE
0b7dce54 784 virtual wxGraphicsContext * CreateContext( const wxPrinterDC& dc) = 0;
c929ad91 785#endif
29188693 786#ifdef __WXMSW__
c929ad91 787#if wxUSE_ENH_METAFILE
8371a353 788 virtual wxGraphicsContext * CreateContext( const wxEnhMetaFileDC& dc) = 0;
29188693 789#endif
220d37c8
SC
790#endif
791
0d3675a6 792 virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ) = 0;
9e605538 793
0d3675a6 794 virtual wxGraphicsContext * CreateContextFromNativeWindow( void * window ) = 0;
9e605538 795
0d3675a6 796 virtual wxGraphicsContext * CreateContext( wxWindow* window ) = 0;
9e605538 797
0a470e5e
VZ
798#if wxUSE_IMAGE
799 virtual wxGraphicsContext * CreateContextFromImage(wxImage& image) = 0;
800#endif // wxUSE_IMAGE
801
ad667945
SC
802 // create a context that can be used for measuring texts only, no drawing allowed
803 virtual wxGraphicsContext * CreateMeasuringContext() = 0;
804
0d3675a6 805 // Path
0b7dce54 806
a4e73390 807 virtual wxGraphicsPath CreatePath() = 0;
9e605538 808
0d3675a6 809 // Matrix
0b7dce54
VZ
810
811 virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
0d3675a6 812 wxDouble tx=0.0, wxDouble ty=0.0) = 0;
0b7dce54 813
9e605538 814 // Paints
0b7dce54
VZ
815
816 virtual wxGraphicsPen CreatePen(const wxPen& pen) = 0;
817
818 virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) = 0;
819
4ee4c7b9
VZ
820 // Gradient brush creation functions may not honour all the stops specified
821 // stops and use just its boundary colours (this is currently the case
822 // under OS X)
823 virtual wxGraphicsBrush
824 CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
825 wxDouble x2, wxDouble y2,
826 const wxGraphicsGradientStops& stops) = 0;
9e605538 827
4ee4c7b9
VZ
828 virtual wxGraphicsBrush
829 CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
830 wxDouble xc, wxDouble yc,
831 wxDouble radius,
832 const wxGraphicsGradientStops& stops) = 0;
9e605538 833
4ee4c7b9 834 // sets the font
2c820406 835 virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0;
fa378d36
VZ
836 virtual wxGraphicsFont CreateFont(double sizeInPixels,
837 const wxString& facename,
838 int flags = wxFONTFLAG_DEFAULT,
839 const wxColour& col = *wxBLACK) = 0;
d974a494 840
1796d384
SC
841 // create a native bitmap representation
842 virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0;
0a470e5e
VZ
843#if wxUSE_IMAGE
844 virtual wxGraphicsBitmap CreateBitmapFromImage(const wxImage& image) = 0;
6e6f074b 845 virtual wxImage CreateImageFromBitmap(const wxGraphicsBitmap& bmp) = 0;
0a470e5e 846#endif // wxUSE_IMAGE
4ee4c7b9 847
2986eb86
SC
848 // create a graphics bitmap from a native bitmap
849 virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ) = 0;
0b7dce54 850
1796d384
SC
851 // create a subimage from a native image representation
852 virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0;
d974a494 853
0b7dce54 854private:
c0c133e1 855 wxDECLARE_NO_COPY_CLASS(wxGraphicsRenderer);
9e605538 856 DECLARE_ABSTRACT_CLASS(wxGraphicsRenderer)
0b7dce54 857};
9e605538 858
6e6f074b
RD
859
860#if wxUSE_IMAGE
861inline
862wxImage wxGraphicsBitmap::ConvertToImage() const
863{
864 wxGraphicsRenderer* renderer = GetRenderer();
865 return renderer ? renderer->CreateImageFromBitmap(*this) : wxNullImage;
866}
867#endif // wxUSE_IMAGE
868
869#endif // wxUSE_GRAPHICS_CONTEXT
50581042 870
8acd14d1 871#endif // _WX_GRAPHICS_H_