Chromium Code Reviews| Index: tests/PathTest.cpp |
| diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp |
| index f4b488b1f904066aa069d969cdb110047db8f9fa..05a81ae7670af2868009edef28d21251c9b8e0b0 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; |
| + 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); |
|
robertphillips
2016/05/31 21:48:36
An -> A ?
bsalomon
2016/06/03 14:49:06
Done.
|
| + // An 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); |