diff options
author | Cary Clark <caryclark@skia.org> | 2017-12-05 11:10:06 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-06 16:50:39 +0000 |
commit | c3823848483eba33c3fa36187de7713e87651c1c (patch) | |
tree | 4247f737f408813ede6a110101dd049218c88057 /tests/PathTest.cpp | |
parent | e45ff46a6587ac0e481a62a85cc42b1a0865d856 (diff) |
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>
Diffstat (limited to 'tests/PathTest.cpp')
-rw-r--r-- | tests/PathTest.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp index b275342e2d..b36179000f 100644 --- a/tests/PathTest.cpp +++ b/tests/PathTest.cpp @@ -4915,3 +4915,31 @@ 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()); + } + } +} |