aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkPath.cpp20
-rw-r--r--tests/PathTest.cpp28
2 files changed, 1 insertions, 47 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index ed3f466a4a..c433424635 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -1417,8 +1417,7 @@ void SkPath::arcTo(SkScalar rx, SkScalar ry, SkScalar angle, SkPath::ArcSize arc
pointTransform.setRotate(angle);
pointTransform.preScale(rx, ry);
- // the arc may be slightly bigger than 1/4 circle, so allow up to 1/3rd
- int segments = SkScalarCeilToInt(SkScalarAbs(thetaArc / (2 * SK_ScalarPI / 3)));
+ int segments = SkScalarCeilToInt(SkScalarAbs(thetaArc / (SK_ScalarPI / 2)));
SkScalar thetaWidth = thetaArc / segments;
SkScalar t = SkScalarTan(0.5f * thetaWidth);
if (!SkScalarIsFinite(t)) {
@@ -1426,12 +1425,6 @@ void SkPath::arcTo(SkScalar rx, SkScalar ry, SkScalar angle, SkPath::ArcSize arc
}
SkScalar startTheta = theta1;
SkScalar w = SkScalarSqrt(SK_ScalarHalf + SkScalarCos(thetaWidth) * SK_ScalarHalf);
- auto scalar_is_integer = [](SkScalar scalar) -> bool {
- return scalar == SkScalarFloorToScalar(scalar);
- };
- bool expectIntegers = SkScalarNearlyZero(SK_ScalarPI/2 - SkScalarAbs(thetaWidth)) &&
- scalar_is_integer(rx) && scalar_is_integer(ry) &&
- scalar_is_integer(x) && scalar_is_integer(y);
for (int i = 0; i < segments; ++i) {
SkScalar endTheta = startTheta + thetaWidth;
SkScalar cosEndTheta, sinEndTheta = SkScalarSinCos(endTheta, &cosEndTheta);
@@ -1442,17 +1435,6 @@ void SkPath::arcTo(SkScalar rx, SkScalar ry, SkScalar angle, SkPath::ArcSize arc
unitPts[0].offset(t * sinEndTheta, -t * cosEndTheta);
SkPoint mapped[2];
pointTransform.mapPoints(mapped, unitPts, (int) SK_ARRAY_COUNT(unitPts));
- /*
- Computing the arc width introduces rounding errors that cause arcs to start
- outside their marks. A round rect may lose convexity as a result. If the input
- values are on integers, place the conic on integers as well.
- */
- if (expectIntegers) {
- SkScalar* mappedScalars = &mapped[0].fX;
- for (unsigned index = 0; index < sizeof(mapped) / sizeof(SkScalar); ++index) {
- mappedScalars[index] = SkScalarRoundToScalar(mappedScalars[index]);
- }
- }
this->conicTo(mapped[0], mapped[1], w);
startTheta = endTheta;
}
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp
index b36179000f..b275342e2d 100644
--- a/tests/PathTest.cpp
+++ b/tests/PathTest.cpp
@@ -4915,31 +4915,3 @@ DEF_TEST(NonFinitePathIteration, reporter) {
REPORTER_ASSERT(reporter, verbs == 0);
}
-
-DEF_TEST(AndroidArc, reporter) {
- const char* tests[] = {
- "M50,0A50,50,0,0 1 100,50 L100,85 A15,15,0,0 1 85,100 L50,100 A50,50,0,0 1 50,0z",
- "M50,0L92,0 A8,8,0,0 1 100,8 L100,92 A8,8,0,0 1 92,100 L8,100"
- " A8,8,0,0 1 0,92 L 0,8 A8,8,0,0 1 8,0z",
- "M50 0A50 50,0,1,1,50 100A50 50,0,1,1,50 0"
- };
- for (auto test : tests) {
- SkPath aPath;
- SkAssertResult(SkParsePath::FromSVGString(test, &aPath));
- SkASSERT(aPath.isConvex());
- for (SkScalar scale = 1; scale < 1000; scale *= 1.1f) {
- SkPath scalePath = aPath;
- SkMatrix matrix;
- matrix.setScale(scale, scale);
- scalePath.transform(matrix);
- SkASSERT(scalePath.isConvex());
- }
- for (SkScalar scale = 1; scale < .001; scale /= 1.1f) {
- SkPath scalePath = aPath;
- SkMatrix matrix;
- matrix.setScale(scale, scale);
- scalePath.transform(matrix);
- SkASSERT(scalePath.isConvex());
- }
- }
-}