Fixed appending circle/ellipse to wxGraphicsPath with Direct2D renderer.

Circle/ellipse should be appended as a closed sub-path and the current point after the operation should be moved to "the rightmost point" of the figure ((x+r,y) and (x+w,y+h/2) respectively).

See #17520
This commit is contained in:
Artur Wieczorek
2016-05-04 21:59:13 +02:00
parent e2b13a7b8e
commit 008a162241
2 changed files with 16 additions and 11 deletions

View File

@@ -51,6 +51,7 @@ public:
/** /**
Appends a circle around (@a x,@a y) with radius @a r as a new closed Appends a circle around (@a x,@a y) with radius @a r as a new closed
subpath. subpath.
After this call the current point will be at (@a x+@a r, @a y).
*/ */
virtual void AddCircle(wxDouble x, wxDouble y, wxDouble r); virtual void AddCircle(wxDouble x, wxDouble y, wxDouble r);
@@ -70,7 +71,9 @@ public:
const wxPoint2DDouble& e); const wxPoint2DDouble& e);
/** /**
Appends an ellipse fitting into the passed in rectangle. Appends an ellipse fitting into the passed in rectangle as a new
closed subpath.
After this call the current point will be at (@a x+@a w, @a y+@a h/2).
*/ */
virtual void AddEllipse(wxDouble x, wxDouble y, wxDouble w, wxDouble h); virtual void AddEllipse(wxDouble x, wxDouble y, wxDouble w, wxDouble h);

View File

@@ -1239,7 +1239,17 @@ void wxD2DPathData::AddEllipse(wxDouble x, wxDouble y, wxDouble w, wxDouble h)
const wxDouble rx = w / 2.0; const wxDouble rx = w / 2.0;
const wxDouble ry = h / 2.0; const wxDouble ry = h / 2.0;
MoveToPoint(x, y + ry); MoveToPoint(x + w, y + ry);
D2D1_ARC_SEGMENT arcSegmentLower =
{
D2D1::Point2((FLOAT)(x), (FLOAT)(y + ry)), // end point
D2D1::SizeF((FLOAT)(rx), (FLOAT)(ry)), // size
0.0f,
D2D1_SWEEP_DIRECTION_CLOCKWISE,
D2D1_ARC_SIZE_SMALL
};
m_geometrySink->AddArc(arcSegmentLower);
D2D1_ARC_SEGMENT arcSegmentUpper = D2D1_ARC_SEGMENT arcSegmentUpper =
{ {
@@ -1251,15 +1261,7 @@ void wxD2DPathData::AddEllipse(wxDouble x, wxDouble y, wxDouble w, wxDouble h)
}; };
m_geometrySink->AddArc(arcSegmentUpper); m_geometrySink->AddArc(arcSegmentUpper);
D2D1_ARC_SEGMENT arcSegmentLower = CloseSubpath();
{
D2D1::Point2((FLOAT)(x), (FLOAT)(y + ry)), // end point
D2D1::SizeF((FLOAT)(rx), (FLOAT)(ry)), // size
0.0f,
D2D1_SWEEP_DIRECTION_CLOCKWISE,
D2D1_ARC_SIZE_SMALL
};
m_geometrySink->AddArc(arcSegmentLower);
} }
// gets the last point of the current path, (0,0) if not yet set // gets the last point of the current path, (0,0) if not yet set