| Index: src/core/SkPath.cpp
|
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
|
| index 3cbc76ad8f1dac52e61410f5b4a56534d79cd4ca..4c49e6bc126e6871cf102dc64b75120173951368 100644
|
| --- a/src/core/SkPath.cpp
|
| +++ b/src/core/SkPath.cpp
|
| @@ -1290,6 +1290,25 @@ void SkPath::arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
|
| angles_to_unit_vectors(startAngle, sweepAngle, &startV, &stopV, &dir);
|
|
|
| SkPoint singlePt;
|
| +
|
| + // At this point, we know that the arc is not a lone point, but startV == stopV
|
| + // indicates that the sweepAngle is too small such that angles_to_unit_vectors
|
| + // cannot handle it.
|
| + if (startV == stopV) {
|
| + SkScalar endAngle = SkDegreesToRadians(startAngle + sweepAngle);
|
| + SkScalar radiusX = oval.width() / 2;
|
| + SkScalar radiusY = oval.height() / 2;
|
| + // We cannot use SkScalarSinCos function in the next line because
|
| + // SkScalarSinCos has a threshold *SkScalarNearlyZero*. When sin(startAngle)
|
| + // is 0 and sweepAngle is very small and radius is huge, the expected
|
| + // behavior here is to draw a line. But calling SkScalarSinCos will
|
| + // make sin(endAngle) to be 0 which will then draw a dot.
|
| + singlePt.set(oval.centerX() + radiusX * sk_float_cos(endAngle),
|
| + oval.centerY() + radiusY * sk_float_sin(endAngle));
|
| + forceMoveTo ? this->moveTo(singlePt) : this->lineTo(singlePt);
|
| + return;
|
| + }
|
| +
|
| SkConic conics[SkConic::kMaxConicsForArc];
|
| int count = build_arc_conics(oval, startV, stopV, dir, conics, &singlePt);
|
| if (count) {
|
|
|