| Index: src/core/SkPath.cpp
|
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
|
| index 23c00e06f7b40922a050b6d4d75f1e773ac255c8..682c94544c817e8623a1bdb6a87f31ee7f39ea0d 100644
|
| --- a/src/core/SkPath.cpp
|
| +++ b/src/core/SkPath.cpp
|
| @@ -894,17 +894,14 @@ void SkPath::addPoly(const SkPoint pts[], int count, bool close) {
|
|
|
| #include "SkGeometry.h"
|
|
|
| -static int build_arc_points(const SkRect& oval, SkScalar startAngle,
|
| - SkScalar sweepAngle,
|
| - SkPoint pts[kSkBuildQuadArcStorage]) {
|
| -
|
| - if (0 == sweepAngle &&
|
| - (0 == startAngle || SkIntToScalar(360) == startAngle)) {
|
| +static bool arc_is_lone_point(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
|
| + SkPoint* pt) {
|
| + if (0 == sweepAngle && (0 == startAngle || SkIntToScalar(360) == startAngle)) {
|
| // Chrome uses this path to move into and out of ovals. If not
|
| // treated as a special case the moves can distort the oval's
|
| // bounding box (and break the circle special case).
|
| - pts[0].set(oval.fRight, oval.centerY());
|
| - return 1;
|
| + pt->set(oval.fRight, oval.centerY());
|
| + return true;
|
| } else if (0 == oval.width() && 0 == oval.height()) {
|
| // Chrome will sometimes create 0 radius round rects. Having degenerate
|
| // quad segments in the path prevents the path from being recognized as
|
| @@ -912,10 +909,14 @@ static int build_arc_points(const SkRect& oval, SkScalar startAngle,
|
| // TODO: optimizing the case where only one of width or height is zero
|
| // should also be considered. This case, however, doesn't seem to be
|
| // as common as the single point case.
|
| - pts[0].set(oval.fRight, oval.fTop);
|
| - return 1;
|
| + pt->set(oval.fRight, oval.fTop);
|
| + return true;
|
| }
|
| + return false;
|
| +}
|
|
|
| +static int build_arc_points(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
|
| + SkPoint pts[kSkBuildQuadArcStorage]) {
|
| SkVector start, stop;
|
|
|
| start.fY = SkScalarSinCos(SkDegreesToRadians(startAngle), &start.fX);
|
| @@ -1309,13 +1310,20 @@ void SkPath::arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
|
| return;
|
| }
|
|
|
| + if (fPathRef->countVerbs() == 0) {
|
| + forceMoveTo = true;
|
| + }
|
| +
|
| + SkPoint lonePt;
|
| + if (arc_is_lone_point(oval, startAngle, sweepAngle, &lonePt)) {
|
| + forceMoveTo ? this->moveTo(lonePt) : this->lineTo(lonePt);
|
| + return;
|
| + }
|
| +
|
| SkPoint pts[kSkBuildQuadArcStorage];
|
| int count = build_arc_points(oval, startAngle, sweepAngle, pts);
|
| SkASSERT((count & 1) == 1);
|
|
|
| - if (fPathRef->countVerbs() == 0) {
|
| - forceMoveTo = true;
|
| - }
|
| this->incReserve(count);
|
| forceMoveTo ? this->moveTo(pts[0]) : this->lineTo(pts[0]);
|
| for (int i = 1; i < count; i += 2) {
|
| @@ -1335,6 +1343,12 @@ void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle
|
| return;
|
| }
|
|
|
| + SkPoint lonePt;
|
| + if (arc_is_lone_point(oval, startAngle, sweepAngle, &lonePt)) {
|
| + this->moveTo(lonePt);
|
| + return;
|
| + }
|
| +
|
| SkPoint pts[kSkBuildQuadArcStorage];
|
| int count = build_arc_points(oval, startAngle, sweepAngle, pts);
|
|
|
|
|