From a5d4a99bb0a082fe7c0991c1a6ccd1f7618d1712 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Tue, 31 May 2016 20:59:25 +0200 Subject: [PATCH] Use native methods to draw some geometric figures using Cairo renderer There are straightforward ways to draw rectangles, circles and ellipses using native methods provided by Cairo renderer and they should be used instead of generic implementations. See #17554 --- src/generic/graphicc.cpp | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index 24aa0c0a1c..a2b2dd3f7b 100644 --- a/src/generic/graphicc.cpp +++ b/src/generic/graphicc.cpp @@ -155,13 +155,16 @@ public : // using the primitives from above // - /* - // appends a rectangle as a new closed subpath - virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) ; - // appends an ellipsis as a new closed subpath fitting the passed rectangle - virtual void AddEllipsis( wxDouble x, wxDouble y, wxDouble w , wxDouble h ) ; + virtual void AddRectangle(wxDouble x, wxDouble y, wxDouble w, wxDouble h) wxOVERRIDE; + // appends a circle as a new closed subpath + virtual void AddCircle(wxDouble x, wxDouble y, wxDouble r) wxOVERRIDE; + + // appends an ellipse as a new closed subpath fitting the passed rectangle + virtual void AddEllipse(wxDouble x, wxDouble y, wxDouble w, wxDouble h) wxOVERRIDE; + + /* // draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ; */ @@ -1208,6 +1211,33 @@ bool wxCairoPathData::Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillSt return cairo_in_fill( m_pathContext, x, y) != 0; } +// Convenience functions + +void wxCairoPathData::AddRectangle(wxDouble x, wxDouble y, wxDouble w, wxDouble h) +{ + cairo_rectangle(m_pathContext, x, y, w, h); +} + +void wxCairoPathData::AddCircle(wxDouble x, wxDouble y, wxDouble r) +{ + cairo_move_to(m_pathContext, x+r, y); + cairo_arc(m_pathContext, x, y, r, 0.0, 2*M_PI); + cairo_close_path(m_pathContext); +} + +void wxCairoPathData::AddEllipse(wxDouble x, wxDouble y, wxDouble w, wxDouble h) +{ + cairo_move_to(m_pathContext, x+w, y+h/2.0); + w /= 2.0; + h /= 2.0; + cairo_save(m_pathContext); + cairo_translate(m_pathContext, x+w, y+h); + cairo_scale(m_pathContext, w, h); + cairo_arc(m_pathContext, 0.0, 0.0, 1.0, 0.0, 2*M_PI); + cairo_restore(m_pathContext); + cairo_close_path(m_pathContext); +} + //----------------------------------------------------------------------------- // wxCairoMatrixData implementation //-----------------------------------------------------------------------------