| Index: src/core/SkPath.cpp
|
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
|
| index 03bc3170d832015eb12614df5baffc5e90250e2e..aabcafdd11888649abb7206d0765336e5be53b9e 100644
|
| --- a/src/core/SkPath.cpp
|
| +++ b/src/core/SkPath.cpp
|
| @@ -5,6 +5,7 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| +#include <cmath>
|
| #include "SkBuffer.h"
|
| #include "SkCubicClipper.h"
|
| #include "SkErrorInternals.h"
|
| @@ -1421,10 +1422,21 @@ void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle
|
| const SkScalar kFullCircleAngle = SkIntToScalar(360);
|
|
|
| if (sweepAngle >= kFullCircleAngle || sweepAngle <= -kFullCircleAngle) {
|
| - this->addOval(oval, sweepAngle > 0 ? kCW_Direction : kCCW_Direction);
|
| - } else {
|
| - this->arcTo(oval, startAngle, sweepAngle, true);
|
| + // We can treat the arc as an oval if it begins at one of our legal starting positions.
|
| + // See SkPath::addOval() docs.
|
| + SkScalar startOver90 = startAngle / 90.f;
|
| + SkScalar startOver90I = SkScalarRoundToScalar(startOver90);
|
| + SkScalar error = startOver90 - startOver90I;
|
| + if (SkScalarNearlyEqual(error, 0)) {
|
| + // Index 1 is at startAngle == 0.
|
| + SkScalar startIndex = std::fmod(startOver90I + 1.f, 4.f);
|
| + startIndex = startIndex < 0 ? startIndex + 4.f : startIndex;
|
| + this->addOval(oval, sweepAngle > 0 ? kCW_Direction : kCCW_Direction,
|
| + (unsigned) startIndex);
|
| + return;
|
| + }
|
| }
|
| + this->arcTo(oval, startAngle, sweepAngle, true);
|
| }
|
|
|
| /*
|
|
|