aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/PathOpsTightBoundsTest.cpp
diff options
context:
space:
mode:
authorGravatar caryclark <caryclark@google.com>2016-10-05 13:23:00 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-10-05 13:23:00 -0700
commit61c21cdcc31081a1bd4a3a7480b482d135f7df33 (patch)
treebbb9ef53cd4b178918a7635f09828bc98f0cf038 /tests/PathOpsTightBoundsTest.cpp
parentc245574ba3d0e2ade6c94b2812de3baa383bf4c4 (diff)
tight bounds optimization
Add support for tight bounds to detect and return moveTo followed by close or zero-length lineTo. Also short circuit so that hard work is avoided when the path bounds is also the tight bounds. Avoid doing work if the bounds can be trivially computed. Include naked moveTo coordinates in the tight bounds. R=fmalita@chromium.org BUG=skia:5555, skia:5553 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2394443004 Review-Url: https://codereview.chromium.org/2394443004
Diffstat (limited to 'tests/PathOpsTightBoundsTest.cpp')
-rw-r--r--tests/PathOpsTightBoundsTest.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/PathOpsTightBoundsTest.cpp b/tests/PathOpsTightBoundsTest.cpp
index 953756170b..8fd0fdb453 100644
--- a/tests/PathOpsTightBoundsTest.cpp
+++ b/tests/PathOpsTightBoundsTest.cpp
@@ -120,3 +120,71 @@ DEF_TEST(PathOpsTightBoundsQuads, reporter) {
}
testRunner.render();
}
+
+DEF_TEST(PathOpsTightBoundsMove, reporter) {
+ SkPath path;
+ path.moveTo(10, 10);
+ path.close();
+ path.moveTo(20, 20);
+ path.lineTo(20, 20);
+ path.close();
+ path.moveTo(15, 15);
+ path.lineTo(15, 15);
+ path.close();
+ const SkRect& bounds = path.getBounds();
+ SkRect tight;
+ REPORTER_ASSERT(reporter, TightBounds(path, &tight));
+ REPORTER_ASSERT(reporter, bounds == tight);
+}
+
+DEF_TEST(PathOpsTightBoundsMoveOne, reporter) {
+ SkPath path;
+ path.moveTo(20, 20);
+ const SkRect& bounds = path.getBounds();
+ SkRect tight;
+ REPORTER_ASSERT(reporter, TightBounds(path, &tight));
+ REPORTER_ASSERT(reporter, bounds == tight);
+}
+
+DEF_TEST(PathOpsTightBoundsMoveTwo, reporter) {
+ SkPath path;
+ path.moveTo(20, 20);
+ path.moveTo(40, 40);
+ const SkRect& bounds = path.getBounds();
+ SkRect tight;
+ REPORTER_ASSERT(reporter, TightBounds(path, &tight));
+ REPORTER_ASSERT(reporter, bounds == tight);
+}
+
+DEF_TEST(PathOpsTightBoundsTiny, reporter) {
+ SkPath path;
+ path.moveTo(1, 1);
+ path.quadTo(1.000001f, 1, 1, 1);
+ const SkRect& bounds = path.getBounds();
+ SkRect tight;
+ REPORTER_ASSERT(reporter, TightBounds(path, &tight));
+ SkRect moveBounds = {1, 1, 1, 1};
+ REPORTER_ASSERT(reporter, bounds != tight);
+ REPORTER_ASSERT(reporter, moveBounds == tight);
+}
+
+DEF_TEST(PathOpsTightBoundsWellBehaved, reporter) {
+ SkPath path;
+ path.moveTo(1, 1);
+ path.quadTo(2, 3, 4, 5);
+ const SkRect& bounds = path.getBounds();
+ SkRect tight;
+ REPORTER_ASSERT(reporter, TightBounds(path, &tight));
+ REPORTER_ASSERT(reporter, bounds == tight);
+}
+
+DEF_TEST(PathOpsTightBoundsIllBehaved, reporter) {
+ SkPath path;
+ path.moveTo(1, 1);
+ path.quadTo(4, 3, 2, 2);
+ const SkRect& bounds = path.getBounds();
+ SkRect tight;
+ REPORTER_ASSERT(reporter, TightBounds(path, &tight));
+ REPORTER_ASSERT(reporter, bounds != tight);
+}
+