diff options
author | Cary Clark <caryclark@google.com> | 2017-12-06 20:07:51 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-06 20:07:56 +0000 |
commit | 51041378442546711af0f5c767c8bac5a4fd757d (patch) | |
tree | dd501982fa1da17d444f3aae5a592a45656d486c | |
parent | 0554d497f80997658b5d0417897af4b818aae958 (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.cpp | 20 | ||||
-rw-r--r-- | tests/PathTest.cpp | 28 |
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()); - } - } -} |