summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/experimental/Intersection/SimplifyFindTop_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/experimental/Intersection/SimplifyFindTop_Test.cpp')
-rw-r--r--chromium/third_party/skia/experimental/Intersection/SimplifyFindTop_Test.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/chromium/third_party/skia/experimental/Intersection/SimplifyFindTop_Test.cpp b/chromium/third_party/skia/experimental/Intersection/SimplifyFindTop_Test.cpp
new file mode 100644
index 00000000000..5f267503a9c
--- /dev/null
+++ b/chromium/third_party/skia/experimental/Intersection/SimplifyFindTop_Test.cpp
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "Simplify.h"
+
+namespace SimplifyFindTopTest {
+
+#include "Simplify.cpp"
+
+} // end of SimplifyFindTopTest namespace
+
+#include "Intersection_Tests.h"
+
+static const SimplifyFindTopTest::Segment* testCommon(
+ SkTArray<SimplifyFindTopTest::Contour>& contours,
+ int& index, int& end) {
+ SkTDArray<SimplifyFindTopTest::Contour*> contourList;
+ makeContourList(contours, contourList, false, false);
+ addIntersectTs(contourList[0], contourList[0]);
+ if (contours.count() > 1) {
+ SkASSERT(contours.count() == 2);
+ addIntersectTs(contourList[0], contourList[1]);
+ addIntersectTs(contourList[1], contourList[1]);
+ }
+ fixOtherTIndex(contourList);
+#if SORTABLE_CONTOURS // old way
+ SimplifyFindTopTest::Segment* topStart = findTopContour(contourList);
+ const SimplifyFindTopTest::Segment* topSegment = topStart->findTop(index,
+ end);
+#else
+ SkPoint bestXY = {SK_ScalarMin, SK_ScalarMin};
+ bool done, unsortable = false;
+ const SimplifyFindTopTest::Segment* topSegment =
+ findSortableTop(contourList, index, end, bestXY, unsortable, done, true);
+#endif
+ return topSegment;
+}
+
+static void test(const SkPath& path) {
+ SkTArray<SimplifyFindTopTest::Contour> contours;
+ SimplifyFindTopTest::EdgeBuilder builder(path, contours);
+ int index, end;
+ testCommon(contours, index, end);
+ SkASSERT(index + 1 == end);
+}
+
+static void test(const SkPath& path, SkScalar x1, SkScalar y1,
+ SkScalar x2, SkScalar y2) {
+ SkTArray<SimplifyFindTopTest::Contour> contours;
+ SimplifyFindTopTest::EdgeBuilder builder(path, contours);
+ int index, end;
+ const SimplifyFindTopTest::Segment* topSegment =
+ testCommon(contours, index, end);
+ SkPoint pts[2];
+ double firstT = topSegment->t(index);
+ pts[0] = topSegment->xyAtT(&topSegment->span(index));
+ int direction = index < end ? 1 : -1;
+ do {
+ index += direction;
+ double nextT = topSegment->t(index);
+ if (nextT == firstT) {
+ continue;
+ }
+ pts[1] = topSegment->xyAtT(&topSegment->span(index));
+ if (pts[0] != pts[1]) {
+ break;
+ }
+ } while (true);
+ SkASSERT(pts[0].fX == x1);
+ SkASSERT(pts[0].fY == y1);
+ SkASSERT(pts[1].fX == x2);
+ SkASSERT(pts[1].fY == y2);
+}
+
+static void testLine1() {
+ SkPath path;
+ path.moveTo(2,0);
+ path.lineTo(1,1);
+ path.lineTo(0,0);
+ path.close();
+ test(path);
+}
+
+static void addInnerCWTriangle(SkPath& path) {
+ path.moveTo(3,0);
+ path.lineTo(4,1);
+ path.lineTo(2,1);
+ path.close();
+}
+
+static void addInnerCCWTriangle(SkPath& path) {
+ path.moveTo(3,0);
+ path.lineTo(2,1);
+ path.lineTo(4,1);
+ path.close();
+}
+
+static void addOuterCWTriangle(SkPath& path) {
+ path.moveTo(3,0);
+ path.lineTo(6,2);
+ path.lineTo(0,2);
+ path.close();
+}
+
+static void addOuterCCWTriangle(SkPath& path) {
+ path.moveTo(3,0);
+ path.lineTo(0,2);
+ path.lineTo(6,2);
+ path.close();
+}
+
+static void testLine2() {
+ SkPath path;
+ addInnerCWTriangle(path);
+ addOuterCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine3() {
+ SkPath path;
+ addOuterCWTriangle(path);
+ addInnerCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine4() {
+ SkPath path;
+ addInnerCCWTriangle(path);
+ addOuterCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine5() {
+ SkPath path;
+ addOuterCWTriangle(path);
+ addInnerCCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine6() {
+ SkPath path;
+ addInnerCWTriangle(path);
+ addOuterCCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine7() {
+ SkPath path;
+ addOuterCCWTriangle(path);
+ addInnerCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine8() {
+ SkPath path;
+ addInnerCCWTriangle(path);
+ addOuterCCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testLine9() {
+ SkPath path;
+ addOuterCCWTriangle(path);
+ addInnerCCWTriangle(path);
+ test(path, 0, 2, 3, 0);
+}
+
+static void testQuads() {
+ SkPath path;
+ path.moveTo(2,0);
+ path.quadTo(1,1, 0,0);
+ path.close();
+ test(path);
+}
+
+static void testCubics() {
+ SkPath path;
+ path.moveTo(2,0);
+ path.cubicTo(2,3, 1,1, 0,0);
+ path.close();
+ test(path);
+}
+
+static void (*tests[])() = {
+ testLine1,
+ testLine2,
+ testLine3,
+ testLine4,
+ testLine5,
+ testLine6,
+ testLine7,
+ testLine8,
+ testLine9,
+ testQuads,
+ testCubics
+};
+
+static const size_t testCount = sizeof(tests) / sizeof(tests[0]);
+
+static void (*firstTest)() = 0;
+static bool skipAll = false;
+
+void SimplifyFindTop_Test() {
+ if (skipAll) {
+ return;
+ }
+ size_t index = 0;
+ if (firstTest) {
+ while (index < testCount && tests[index] != firstTest) {
+ ++index;
+ }
+ }
+ bool firstTestComplete = false;
+ for ( ; index < testCount; ++index) {
+ (*tests[index])();
+ firstTestComplete = true;
+ }
+}