blob: 362da51525b88ebd796e19a08e787cec4433c680 [file] [log] [blame]
// 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));
}
}