| // Copyright 2023 Google LLC |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. |
| |
| #include "modules/bentleyottmann/include/Contour.h" |
| |
| #include "include/core/SkPath.h" |
| #include "include/core/SkPathBuilder.h" |
| #include "tests/Test.h" |
| |
| using namespace contour; |
| |
| DEF_TEST(CFC_Contours_Basic, r) { |
| { |
| // No contours basic |
| SkPath p; |
| Contours contours = Contours::Make(p); |
| REPORTER_ASSERT(r, contours.empty()); |
| } |
| { |
| // Path with just a close. |
| SkPathBuilder b; |
| b.close(); |
| SkPath p = b.detach(); |
| Contours contours = Contours::Make(p); |
| REPORTER_ASSERT(r, contours.empty()); |
| } |
| { |
| // Path with a bunch of moves. |
| SkPathBuilder b; |
| b.moveTo(10, 10); |
| b.moveTo(20, 20); |
| b.close(); |
| SkPath p = b.detach(); |
| Contours contours = Contours::Make(p); |
| REPORTER_ASSERT(r, contours.empty()); |
| } |
| { |
| // LineTo, but no close. |
| SkPathBuilder b; |
| b.moveTo(10, 10); |
| b.moveTo(20, 20); |
| b.lineTo(30, 30); |
| SkPath p = b.detach(); |
| Contours contours = Contours::Make(p); |
| REPORTER_ASSERT(r, contours.size() == 1); |
| Contour c = *contours.begin(); |
| REPORTER_ASSERT(r, c.points.size() == 2); |
| REPORTER_ASSERT(r, c.points[0].x == 20 * Contours::kScaleFactor); |
| REPORTER_ASSERT(r, c.points[1].x == 30 * Contours::kScaleFactor); |
| REPORTER_ASSERT(r, c.bounds == SkIRect::MakeLTRB(20 * Contours::kScaleFactor, |
| 20 * Contours::kScaleFactor, |
| 30 * Contours::kScaleFactor, |
| 30 * Contours::kScaleFactor)); |
| } |
| { |
| // LineTo with close. |
| SkPathBuilder b; |
| b.moveTo(10, 10); |
| b.moveTo(20, 20); |
| b.lineTo(30, 30); |
| b.close(); |
| SkPath p = b.detach(); |
| Contours contours = Contours::Make(p); |
| REPORTER_ASSERT(r, contours.size() == 1); |
| Contour c = *contours.begin(); |
| REPORTER_ASSERT(r, c.points.size() == 3); |
| REPORTER_ASSERT(r, c.points[0].x == 20 * Contours::kScaleFactor); |
| REPORTER_ASSERT(r, c.points[1].x == 30 * Contours::kScaleFactor); |
| // Extra point added by close. |
| REPORTER_ASSERT(r, c.points[2].x == 20 * Contours::kScaleFactor); |
| REPORTER_ASSERT(r, c.bounds == SkIRect::MakeLTRB(20 * Contours::kScaleFactor, |
| 20 * Contours::kScaleFactor, |
| 30 * Contours::kScaleFactor, |
| 30 * Contours::kScaleFactor)); |
| } |
| { |
| // LineTo with close and extra moves. |
| SkPathBuilder b; |
| b.moveTo(10, 10); |
| b.moveTo(20, 20); |
| b.lineTo(30, 30); |
| b.close(); |
| b.moveTo(100, 100); |
| SkPath p = b.detach(); |
| Contours contours = Contours::Make(p); |
| REPORTER_ASSERT(r, contours.size() == 1); |
| Contour c = *contours.begin(); |
| REPORTER_ASSERT(r, c.points.size() == 3); |
| REPORTER_ASSERT(r, c.points[0].x == 20 * Contours::kScaleFactor); |
| REPORTER_ASSERT(r, c.points[1].x == 30 * Contours::kScaleFactor); |
| // Extra point added by close. |
| REPORTER_ASSERT(r, c.points[2].x == 20 * Contours::kScaleFactor); |
| REPORTER_ASSERT(r, c.bounds == SkIRect::MakeLTRB(20 * Contours::kScaleFactor, |
| 20 * Contours::kScaleFactor, |
| 30 * Contours::kScaleFactor, |
| 30 * Contours::kScaleFactor)); |
| } |
| } |