// 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)); } }