aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Cary Clark <caryclark@google.com>2017-12-06 20:07:51 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-06 20:07:56 +0000
commit51041378442546711af0f5c767c8bac5a4fd757d (patch)
treedd501982fa1da17d444f3aae5a592a45656d486c
parent0554d497f80997658b5d0417897af4b818aae958 (diff)
Revert "keep SVG arcs axis aligned"
This reverts commit c3823848483eba33c3fa36187de7713e87651c1c. Reason for revert: need to add legacy flag to chrome first Original change's description: > keep SVG arcs axis aligned > > Computing the arc width introduces rounding errors that cause the > arc to exceed 1/4 circle and cause integer anchored arcs to start > outside their marks. A round rect may lose convexity as a result. > > Check if arcTo() inputs are integers and arc is 90 degrees; > if so, output conics which are axis-aligned on integers as well. > > This is triggered when using SVG to represent a round rect. > > Possible future enhancements are recorded in bug.skia.org/7383 > > R=​reed@google.com,djsollen@google.com > Change-Id: I6609456fcefabcda6c9560a044533ecb5cda2d31 > Reviewed-on: https://skia-review.googlesource.com/79423 > Reviewed-by: Derek Sollenberger <djsollen@google.com> > Commit-Queue: Derek Sollenberger <djsollen@google.com> TBR=djsollen@google.com,caryclark@google.com,reed@google.com,caryclark@skia.org Change-Id: Ia503ea62def15322df2b11da30d377a9543d6999 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://skia-review.googlesource.com/81281 Reviewed-by: Cary Clark <caryclark@google.com> Commit-Queue: Cary Clark <caryclark@google.com>
-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());
- }
- }
-}