Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(582)

Unified Diff: tests/PathTest.cpp

Issue 2017313002: Add SkPathPriv::IsSimpleClosedRect (Closed) Base URL: https://chromium.googlesource.com/skia.git@fixaddarc
Patch Set: fix gcc warning Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkPathPriv.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/PathTest.cpp
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp
index f4b488b1f904066aa069d969cdb110047db8f9fa..b406f257f5ea8769724c7c4ef063e24dcca80d5b 100644
--- a/tests/PathTest.cpp
+++ b/tests/PathTest.cpp
@@ -1975,6 +1975,103 @@ static void test_isRect(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, !path1.isRect(nullptr));
}
+static void check_simple_closed_rect(skiatest::Reporter* reporter, const SkPath& path,
+ const SkRect& rect, SkPath::Direction dir, unsigned start) {
+ SkRect r = SkRect::MakeEmpty();
+ SkPath::Direction d = SkPath::kCCW_Direction;
+ unsigned s = ~0U;
+
+ REPORTER_ASSERT(reporter, SkPathPriv::IsSimpleClosedRect(path, &r, &d, &s));
+ REPORTER_ASSERT(reporter, r == rect);
+ REPORTER_ASSERT(reporter, d == dir);
+ REPORTER_ASSERT(reporter, s == start);
+}
+
+static void test_is_simple_closed_rect(skiatest::Reporter* reporter) {
+ SkRect r = SkRect::MakeEmpty();
+ SkPath::Direction d = SkPath::kCCW_Direction;
+ unsigned s = ~0U;
+
+ const SkRect testRect = SkRect::MakeXYWH(10, 10, 50, 70);
+ const SkRect emptyRect = SkRect::MakeEmpty();
+ SkPath path;
+ for (int start = 0; start < 4; ++start) {
+ for (auto dir : {SkPath::kCCW_Direction, SkPath::kCW_Direction}) {
+ SkPath path;
+ path.addRect(testRect, dir, start);
+ check_simple_closed_rect(reporter, path, testRect, dir, start);
+ path.close();
+ check_simple_closed_rect(reporter, path, testRect, dir, start);
+ SkPath path2 = path;
+ path2.lineTo(10, 10);
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ path2 = path;
+ path2.moveTo(10, 10);
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ path2 = path;
+ path2.addRect(testRect, dir, start);
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ // Make the path by hand, manually closing it.
+ path2.reset();
+ SkPath::RawIter iter(path);
+ SkPath::Verb v;
+ SkPoint verbPts[4];
+ SkPoint firstPt = {0.f, 0.f};
+ while ((v = iter.next(verbPts)) != SkPath::kDone_Verb) {
+ switch(v) {
+ case SkPath::kMove_Verb:
+ firstPt = verbPts[0];
+ path2.moveTo(verbPts[0]);
+ break;
+ case SkPath::kLine_Verb:
+ path2.lineTo(verbPts[1]);
+ break;
+ default:
+ break;
+ }
+ }
+ // We haven't closed it yet...
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ // ... now we do and test again.
+ path2.lineTo(firstPt);
+ check_simple_closed_rect(reporter, path2, testRect, dir, start);
+ // A redundant close shouldn't cause a failure.
+ path2.close();
+ check_simple_closed_rect(reporter, path2, testRect, dir, start);
+ // Degenerate point and line rects are not allowed
+ path2.reset();
+ path2.addRect(emptyRect, dir, start);
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ SkRect degenRect = testRect;
+ degenRect.fLeft = degenRect.fRight;
+ path2.reset();
+ path2.addRect(degenRect, dir, start);
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ degenRect = testRect;
+ degenRect.fTop = degenRect.fBottom;
+ path2.reset();
+ path2.addRect(degenRect, dir, start);
+ REPORTER_ASSERT(reporter, !SkPathPriv::IsSimpleClosedRect(path2, &r, &d, &s));
+ // An inverted rect makes a rect path, but changes the winding dir and start point.
+ SkPath::Direction swapDir = (dir == SkPath::kCW_Direction)
+ ? SkPath::kCCW_Direction
+ : SkPath::kCW_Direction;
+ static constexpr unsigned kXSwapStarts[] = { 1, 0, 3, 2 };
+ static constexpr unsigned kYSwapStarts[] = { 3, 2, 1, 0 };
+ SkRect swapRect = testRect;
+ SkTSwap(swapRect.fLeft, swapRect.fRight);
+ path2.reset();
+ path2.addRect(swapRect, dir, start);
+ check_simple_closed_rect(reporter, path2, testRect, swapDir, kXSwapStarts[start]);
+ swapRect = testRect;
+ SkTSwap(swapRect.fTop, swapRect.fBottom);
+ path2.reset();
+ path2.addRect(swapRect, dir, start);
+ check_simple_closed_rect(reporter, path2, testRect, swapDir, kYSwapStarts[start]);
+ }
+ }
+}
+
static void test_isNestedFillRects(skiatest::Reporter* reporter) {
// passing tests (all moveTo / lineTo...
SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW
@@ -4150,6 +4247,7 @@ DEF_TEST(Paths, reporter) {
test_operatorEqual(reporter);
test_isLine(reporter);
test_isRect(reporter);
+ test_is_simple_closed_rect(reporter);
test_isNestedFillRects(reporter);
test_zero_length_paths(reporter);
test_direction(reporter);
« no previous file with comments | « src/core/SkPathPriv.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698