1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: interface of wxGraphicsPath
4 // Author: wxWidgets team
6 // Licence: wxWindows license
7 /////////////////////////////////////////////////////////////////////////////
12 A wxGraphicsPath is a native representation of an geometric path. The contents
13 are specific an private to the respective renderer. Instances are ref counted and can
14 therefore be assigned as usual. The only way to get a valid instance is via
15 wxGraphicsContext::CreatePath or wxGraphicsRenderer::CreatePath.
20 class wxGraphicsPath
: public wxGraphicsObject
27 void AddArc(wxDouble x
, wxDouble y
, wxDouble r
,
29 wxDouble endAngle
, bool clockwise
);
30 void AddArc(const wxPoint2DDouble
& c
, wxDouble r
,
37 Appends a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to
38 (x2,y2), also a straight line from (current) to (x1,y1).
40 virtual void AddArcToPoint(wxDouble x1
, wxDouble y1
, wxDouble x2
,
41 wxDouble y2
, wxDouble r
);
44 Appends a circle around (x,y) with radius r as a new closed subpath.
46 virtual void AddCircle(wxDouble x
, wxDouble y
, wxDouble r
);
52 void AddCurveToPoint(wxDouble cx1
, wxDouble cy1
, wxDouble cx2
,
56 void AddCurveToPoint(const wxPoint2DDouble
& c1
,
57 const wxPoint2DDouble
& c2
,
58 const wxPoint2DDouble
& e
);
62 Appends an ellipse fitting into the passed in rectangle.
64 virtual void AddEllipse(wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
70 void AddLineToPoint(wxDouble x
, wxDouble y
);
71 void AddLineToPoint(const wxPoint2DDouble
& p
);
77 virtual void AddPath(const wxGraphicsPath
& path
);
80 Adds a quadratic Bezier curve from the current point, using a control point and
83 virtual void AddQuadCurveToPoint(wxDouble cx
, wxDouble cy
, wxDouble x
,
87 Appends a rectangle as a new closed subpath.
89 virtual void AddRectangle(wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
92 Appends a rounded rectangle as a new closed subpath.
94 virtual void AddRoundedRectangle(wxDouble x
, wxDouble y
, wxDouble w
,
95 wxDouble h
, wxDouble radius
);
98 Closes the current sub-path.
100 virtual void CloseSubpath();
104 Returns @true if the point is within the path.
106 bool Contains(const wxPoint2DDouble
& c
,
107 int fillStyle
= wxODDEVEN_RULE
) const;
108 const bool Contains(wxDouble x
, wxDouble y
,
109 int fillStyle
= wxODDEVEN_RULE
) const;
114 Gets the bounding box enclosing all points (possibly including control points).
116 wxRect2DDouble
GetBox() const;
117 const void GetBox(wxDouble
* x
, wxDouble
* y
, wxDouble
* w
,
123 Gets the last point of the current path, (0,0) if not yet set.
125 void GetCurrentPoint(wxDouble
* x
, wxDouble
* y
) const;
126 const wxPoint2DDouble
GetCurrentPoint() const;
130 Returns the native path (CGPathRef for Core Graphics, Path pointer for GDIPlus
131 and a cairo_path_t pointer for cairo).
133 virtual void* GetNativePath() const;
137 Begins a new subpath at (x,y)
139 void MoveToPoint(wxDouble x
, wxDouble y
);
140 void MoveToPoint(const wxPoint2DDouble
& p
);
144 Transforms each point of this path by the matrix.
146 virtual void Transform(const wxGraphicsMatrix
& matrix
);
149 Gives back the native path returned by GetNativePath() because there might be
150 some deallocations necessary (eg on cairo the native path returned by
151 GetNativePath is newly allocated each time).
153 virtual void UnGetNativePath(void* p
) const;
159 @class wxGraphicsObject
161 This class is the superclass of native graphics objects like pens etc. It
162 allows reference counting. Not instantiated by user code.
167 @see wxGraphicsBrush, wxGraphicsPen, wxGraphicsMatrix, wxGraphicsPath
169 class wxGraphicsObject
: public wxObject
173 Returns the renderer that was used to create this instance, or @NULL if it has
174 not been initialized yet
176 wxGraphicsRenderer
* GetRenderer() const;
179 Is this object valid (@false) or still empty (@true)?
187 @class wxGraphicsContext
189 A wxGraphicsContext instance is the object that is drawn upon. It is created by
190 a renderer using wxGraphicsRenderer::CreateContext(). This can be either directly
191 using a renderer instance, or indirectly using the static convenience Create()
192 functions of wxGraphicsContext that always delegate the task to the default renderer.
195 void MyCanvas::OnPaint(wxPaintEvent &event)
200 // Create graphics context from it
201 wxGraphicsContext *gc = wxGraphicsContext::Create( dc );
205 // make a path that contains a circle and some lines
206 gc->SetPen( *wxRED_PEN );
207 wxGraphicsPath path = gc->CreatePath();
208 path.AddCircle( 50.0, 50.0, 50.0 );
209 path.MoveToPoint(0.0, 50.0);
210 path.AddLineToPoint(100.0, 50.0);
211 path.MoveToPoint(50.0, 0.0);
212 path.AddLineToPoint(50.0, 100.0 );
214 path.AddRectangle(25.0, 25.0, 50.0, 50.0);
216 gc->StrokePath(path);
227 @see wxGraphicsRenderer::CreateContext(), wxGCDC, wxDC
229 class wxGraphicsContext
: public wxGraphicsObject
233 Creates a wxGraphicsContext from a wxWindow.
235 @see wxGraphicsRenderer::CreateContext()
237 static wxGraphicsContext
* Create( wxWindow
* window
) ;
240 Creates a wxGraphicsContext from a wxWindowDC
242 @see wxGraphicsRenderer::CreateContext()
244 static wxGraphicsContext
* Create( const wxWindowDC
& dc
) ;
247 Creates a wxGraphicsContext from a wxMemoryDC
249 @see wxGraphicsRenderer::CreateContext()
251 static wxGraphicsContext
* Create( const wxMemoryDC
& dc
) ;
254 Creates a wxGraphicsContext from a wxPrinterDC. Under
255 GTK+, this will only work when using the GtkPrint
256 printing backend which is available since GTK+ 2.10.
258 @see wxGraphicsRenderer::CreateContext(), @ref overview_unixprinting "Printing under Unix"
260 static wxGraphicsContext
* Create( const wxPrinterDC
& dc
) ;
263 Clips drawings to the region
265 virtual void Clip(const wxRegion
& region
) = 0;
268 Clips drawings to the rectangle.
270 virtual void Clip(wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
) = 0;
273 Concatenates the passed in transform with the current transform of this context
275 virtual void ConcatTransform(const wxGraphicsMatrix
& matrix
) = 0;
279 Creates a native brush from a wxBrush.
281 virtual wxGraphicsBrush
CreateBrush(const wxBrush
& brush
) const;
284 Creates a native graphics font from a wxFont and a text colour.
286 virtual wxGraphicsFont
CreateFont(const wxFont
& font
,
287 const wxColour
& col
= *wxBLACK
) const;
290 Creates a wxGraphicsContext from a native context. This native context must be
291 eg a CGContextRef for Core Graphics, a Graphics pointer for GDIPlus or a
292 cairo_t pointer for cairo.
294 @see wxGraphicsRenderer:: CreateContextFromNativeContext
296 static wxGraphicsContext
* CreateFromNative(void* context
);
299 Creates a wxGraphicsContext from a native window.
301 @see wxGraphicsRenderer:: CreateContextFromNativeWindow
303 static wxGraphicsContext
* CreateFromNativeWindow(void* window
);
306 Creates a native brush, having a linear gradient, starting at (x1,y1) with
307 color c1 to (x2,y2) with color c2
309 wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1
,
313 const wxColouramp
;c1
,
314 const wxColouramp
;c2
) const;
317 Creates a native affine transformation matrix from the passed in values. The
318 defaults result in an identity matrix.
320 virtual wxGraphicsMatrix
CreateMatrix(wxDouble a
= 1.0, wxDouble b
= 0.0,
321 wxDouble c
= 0.0, wxDouble d
= 1.0,
323 wxDouble ty
= 0.0) const;
326 Creates a native graphics path which is initially empty.
328 wxGraphicsPath
CreatePath() const;
331 Creates a native pen from a wxPen.
333 virtual wxGraphicsPen
CreatePen(const wxPen
& pen
) const;
336 Creates a native brush, having a radial gradient originating at (xo,yc) with
337 color oColour and ends on a circle around (xc,yc) with radius r and color cColour
339 virtual wxGraphicsBrush
CreateRadialGradientBrush(wxDouble xo
, wxDouble yo
,
340 wxDouble xc
, wxDouble yc
,
342 const wxColour
& oColor
,
343 const wxColour
& cColor
) const;
346 Draws the bitmap. In case of a mono bitmap, this is treated as a mask and the
347 current brushed is used for filling.
349 virtual void DrawBitmap(const wxBitmap
& bmp
, wxDouble x
, wxDouble y
,
350 wxDouble w
, wxDouble h
) = 0;
355 virtual void DrawEllipse(wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
360 virtual void DrawIcon(const wxIcon
& icon
, wxDouble x
, wxDouble y
,
361 wxDouble w
, wxDouble h
) = 0;
366 virtual void DrawLines(size_t n
, const wxPoint2DDouble
* points
,
367 int fillStyle
= wxODDEVEN_RULE
);
370 Draws the path by first filling and then stroking.
372 virtual void DrawPath(const wxGraphicsPath
& path
,
373 int fillStyle
= wxODDEVEN_RULE
);
378 virtual void DrawRectangle(wxDouble x
, wxDouble y
, wxDouble w
, wxDouble h
);
381 Draws a rounded rectangle.
383 virtual void DrawRoundedRectangle(wxDouble x
, wxDouble y
, wxDouble w
,
384 wxDouble h
, wxDouble radius
);
388 Draws a text at the defined position, at the given angle.
390 void DrawText(const wxString
& str
, wxDouble x
, wxDouble y
,
392 void DrawText(const wxString
& str
, wxDouble x
, wxDouble y
);
396 Fills the path with the current brush.
398 virtual void FillPath(const wxGraphicsPath
& path
,
399 int fillStyle
= wxODDEVEN_RULE
) = 0;
402 Returns the native context (CGContextRef for Core Graphics, Graphics pointer
403 for GDIPlus and cairo_t pointer for cairo).
405 virtual void* GetNativeContext() = 0;
408 Fills the @a widths array with the widths from the beginning of
409 @a text to the corresponding character of @e text.
411 virtual void GetPartialTextExtents(const wxString
& text
,
412 wxArrayDouble
& widths
) const = 0;
415 Gets the dimensions of the string using the currently selected font.
416 @e string is the text string to measure, @e w and @e h are
417 the total width and height respectively, @a descent is the
418 dimension from the baseline of the font to the bottom of the
419 descender, and @a externalLeading is any extra vertical space added
420 to the font by the font designer (usually is zero).
422 virtual void GetTextExtent(const wxString
& text
, wxDouble
* width
,
423 wxDouble
* height
, wxDouble
* descent
,
424 wxDouble
* externalLeading
) const = 0;
427 Gets the current transformation matrix of this context.
429 virtual wxGraphicsMatrix
GetTransform() const = 0;
432 Resets the clipping to original shape.
434 virtual void ResetClip() = 0;
437 Rotates the current transformation matrix (radians),
439 virtual void Rotate(wxDouble angle
) = 0;
442 Scales the current transformation matrix.
444 virtual void Scale(wxDouble xScale
, wxDouble yScale
) = 0;
448 Sets the brush for filling paths.
450 void SetBrush(const wxBrush
& brush
);
451 void SetBrush(const wxGraphicsBrush
& brush
);
456 Sets the font for drawing text.
458 void SetFont(const wxFont
& font
, const wxColour
& colour
);
459 void SetFont(const wxGraphicsFont
& font
);
464 Sets the pen used for stroking.
466 void SetPen(const wxGraphicsPen
& pen
);
467 void SetPen(const wxPen
& pen
);
471 Sets the current transformation matrix of this context
473 virtual void SetTransform(const wxGraphicsMatrix
& matrix
) = 0;
476 Strokes a single line.
478 virtual void StrokeLine(wxDouble x1
, wxDouble y1
, wxDouble x2
, wxDouble y2
);
482 Stroke disconnected lines from begin to end points, fastest method available
485 void StrokeLines(size_t n
, const wxPoint2DDouble
* beginPoints
,
486 const wxPoint2DDouble
* endPoints
);
487 void StrokeLines(size_t n
, const wxPoint2DDouble
* points
);
491 Strokes along a path with the current pen.
493 virtual void StrokePath(const wxGraphicsPath
& path
) = 0;
496 Translates the current transformation matrix.
498 virtual void Translate(wxDouble dx
, wxDouble dy
) = 0;
504 @class wxGraphicsRenderer
506 A wxGraphicsRenderer is the instance corresponding to the rendering engine
507 used. There may be multiple instances on a system, if there are different
508 rendering engines present, but there is always only one instance per engine.
509 This instance is pointed back to by all objects created by it (wxGraphicsContext,
510 wxGraphicsPath etc) and can be retrieved through their wxGraphicsObject::GetRenderer()
511 method. Therefore you can create an additional instance of a path etc. by calling
512 wxGraphicsObject::GetRenderer() and then using the appropriate CreateXXX function
516 wxGraphicsPath *path = // from somewhere
517 wxGraphicsBrush *brush = path->GetRenderer()->CreateBrush( *wxBLACK_BRUSH );
523 class wxGraphicsRenderer
: public wxObject
527 Creates a wxGraphicsContext from a wxWindow.
529 virtual wxGraphicsContext
* CreateContext(wxWindow
* window
) = 0;
532 Creates a wxGraphicsContext from a wxWindowDC
534 virtual wxGraphicsContext
* CreateContext( const wxWindowDC
& dc
) = 0 ;
537 Creates a wxGraphicsContext from a wxMemoryDC
539 virtual wxGraphicsContext
* CreateContext( const wxMemoryDC
& dc
) = 0 ;
542 Creates a wxGraphicsContext from a wxPrinterDC
544 virtual wxGraphicsContext
* CreateContext( const wxPrinterDC
& dc
) = 0 ;
547 Creates a native brush from a wxBrush.
549 virtual wxGraphicsBrush
CreateBrush(const wxBrush
& brush
) = 0;
553 Creates a wxGraphicsContext from a native context. This native context must be
554 eg a CGContextRef for Core Graphics, a Graphics pointer for GDIPlus or a cairo_t
557 virtual wxGraphicsContext
* CreateContextFromNativeContext(void* context
) = 0;
560 Creates a wxGraphicsContext from a native window.
562 virtual wxGraphicsContext
* CreateContextFromNativeWindow(void* window
) = 0;
565 Creates a native graphics font from a wxFont and a text colour.
567 virtual wxGraphicsFont
CreateFont(const wxFont
& font
,
568 const wxColour
& col
= *wxBLACK
) = 0;
571 Creates a native brush, having a linear gradient, starting at (x1,y1) with
572 color c1 to (x2,y2) with color c2
574 wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1
,
578 const wxColouramp
;c1
,
579 const wxColouramp
;c2
);
582 Creates a native affine transformation matrix from the passed in values. The
583 defaults result in an identity matrix.
585 virtual wxGraphicsMatrix
CreateMatrix(wxDouble a
= 1.0, wxDouble b
= 0.0,
586 wxDouble c
= 0.0, wxDouble d
= 1.0,
588 wxDouble ty
= 0.0) = 0;
591 Creates a native graphics path which is initially empty.
593 virtual wxGraphicsPath
CreatePath() = 0;
596 Creates a native pen from a wxPen.
598 virtual wxGraphicsPen
CreatePen(const wxPen
& pen
) = 0;
601 Creates a native brush, having a radial gradient originating at (xo,yc) with
602 color oColour and ends on a circle around (xc,yc) with radius r and color cColour
604 virtual wxGraphicsBrush
CreateRadialGradientBrush(wxDouble xo
, wxDouble yo
,
605 wxDouble xc
, wxDouble yc
,
607 const wxColour
& oColour
,
608 const wxColour
& cColour
) = 0;
611 Returns the default renderer on this platform. On OS X this is the Core
612 Graphics (a.k.a. Quartz 2D) renderer, on MSW the GDIPlus renderer, and on GTK we currently default to the cairo renderer.
614 static wxGraphicsRenderer
* GetDefaultRenderer();
620 @class wxGraphicsBrush
622 A wxGraphicsBrush is a native representation of a brush. The contents
623 are specific and private to the respective renderer. Instances are ref counted and can
624 therefore be assigned as usual. The only way to get a valid instance is via
625 wxGraphicsContext::CreateBrush or wxGraphicsRenderer::CreateBrush.
630 class wxGraphicsBrush
: public wxGraphicsObject
639 @class wxGraphicsFont
641 A wxGraphicsFont is a native representation of a font. The contents
642 are specific and private to the respective renderer. Instances are ref counted and can
643 therefore be assigned as usual. The only way to get a valid instance is via
644 wxGraphicsContext::CreateFont or wxGraphicsRenderer::CreateFont.
649 class wxGraphicsFont
: public wxGraphicsObject
660 A wxGraphicsPen is a native representation of a pen. The contents
661 are specific and private to the respective renderer. Instances are ref counted and can
662 therefore be assigned as usual. The only way to get a valid instance is via
663 wxGraphicsContext::CreatePen or wxGraphicsRenderer::CreatePen.
668 class wxGraphicsPen
: public wxGraphicsObject
677 @class wxGraphicsMatrix
679 A wxGraphicsMatrix is a native representation of an affine matrix. The contents
680 are specific and private to the respective renderer. Instances are ref counted and can
681 therefore be assigned as usual. The only way to get a valid instance is via
682 wxGraphicsContext::CreateMatrix or wxGraphicsRenderer::CreateMatrix.
687 class wxGraphicsMatrix
: public wxGraphicsObject
694 void Concat(const wxGraphicsMatrix
* t
);
695 void Concat(const wxGraphicsMatrix
& t
);
699 Returns the component values of the matrix via the argument pointers.
701 virtual void Get(wxDouble
* a
= NULL
, wxDouble
* b
= NULL
, wxDouble
* c
= NULL
,
702 wxDouble
* d
= NULL
, wxDouble
* tx
= NULL
,
703 wxDouble
* ty
= NULL
) const;
706 Returns the native representation of the matrix. For CoreGraphics this is a
707 CFAffineMatrix pointer. For GDIPlus a Matrix Pointer and for Cairo a cairo_matrix_t pointer.
709 virtual void* GetNativeMatrix() const;
714 virtual void Invert();
717 Returns @true if the elements of the transformation matrix are equal.
719 bool IsEqual(const wxGraphicsMatrix
& t
) const;
722 Return @true if this is the identity matrix.
724 virtual bool IsIdentity() const;
727 Rotates this matrix (radians).
729 virtual void Rotate(wxDouble angle
);
734 virtual void Scale(wxDouble xScale
, wxDouble yScale
);
737 Sets the matrix to the respective values (default values are the identity
740 virtual void Set(wxDouble a
= 1.0, wxDouble b
= 0.0, wxDouble c
= 0.0,
741 wxDouble d
= 1.0, wxDouble tx
= 0.0, wxDouble ty
= 0.0);
744 Applies this matrix to a distance (ie. performs all transforms except
747 virtual void TransformDistance(wxDouble
* dx
, wxDouble
* dy
) const;
750 Applies this matrix to a point.
752 virtual void TransformPoint(wxDouble
* x
, wxDouble
* y
) const;
755 Translates this matrix.
757 virtual void Translate(wxDouble dx
, wxDouble dy
);