• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #define DEBUG_TEST 1
9 
10 #include "Simplify.h"
11 
12 namespace SimplifyFindNextTest {
13 
14 #include "Simplify.cpp"
15 
16 } // end of SimplifyFindNextTest namespace
17 
18 #include "Intersection_Tests.h"
19 
testCommon(int contourWinding,int spanWinding,int startIndex,int endIndex,SkTArray<SimplifyFindNextTest::Contour> & contours)20 static const SimplifyFindNextTest::Segment* testCommon(
21         int contourWinding, int spanWinding, int startIndex, int endIndex,
22         SkTArray<SimplifyFindNextTest::Contour>& contours) {
23     SkTDArray<SimplifyFindNextTest::Contour*> contourList;
24     makeContourList(contours, contourList, false, false);
25     addIntersectTs(contourList[0], contourList[0]);
26     if (contours.count() > 1) {
27         SkASSERT(contours.count() == 2);
28         addIntersectTs(contourList[0], contourList[1]);
29         addIntersectTs(contourList[1], contourList[1]);
30     }
31     fixOtherTIndex(contourList);
32     SimplifyFindNextTest::Segment& segment = contours[0].debugSegments()[0];
33     SkPoint pts[2];
34     pts[0] = segment.xyAtT(&segment.span(endIndex));
35     int nextStart = startIndex;
36     int nextEnd = endIndex;
37     SkTDArray<SimplifyFindNextTest::Span*> chaseArray;
38     bool unsortable = false;
39     SimplifyFindNextTest::Segment* next = segment.findNextWinding(chaseArray,
40             nextStart, nextEnd, unsortable);
41     pts[1] = next->xyAtT(&next->span(nextStart));
42     SkASSERT(pts[0] == pts[1]);
43     return next;
44 }
45 
test(const SkPath & path)46 static void test(const SkPath& path) {
47     SkTArray<SimplifyFindNextTest::Contour> contours;
48     SimplifyFindNextTest::EdgeBuilder builder(path, contours);
49     int contourWinding = 0;
50     int spanWinding = 1;
51     int start = 0;
52     int end = 1;
53     testCommon(contourWinding, spanWinding, start, end, contours);
54 }
55 
test(const SkPath & path,int start,int end)56 static void test(const SkPath& path, int start, int end) {
57     SkTArray<SimplifyFindNextTest::Contour> contours;
58     SimplifyFindNextTest::EdgeBuilder builder(path, contours);
59     int contourWinding = 0;
60     int spanWinding = 1;
61     testCommon(contourWinding, spanWinding, start, end, contours);
62 }
63 
testLine1()64 static void testLine1() {
65     SkPath path;
66     path.moveTo(2,0);
67     path.lineTo(1,1);
68     path.lineTo(0,0);
69     path.close();
70     test(path);
71 }
72 
addInnerCWTriangle(SkPath & path)73 static void addInnerCWTriangle(SkPath& path) {
74     path.moveTo(3,0);
75     path.lineTo(4,1);
76     path.lineTo(2,1);
77     path.close();
78 }
79 
80 #if DEBUG_UNUSED
addInnerCCWTriangle(SkPath & path)81 static void addInnerCCWTriangle(SkPath& path) {
82     path.moveTo(3,0);
83     path.lineTo(2,1);
84     path.lineTo(4,1);
85     path.close();
86 }
87 #endif
88 
addOuterCWTriangle(SkPath & path)89 static void addOuterCWTriangle(SkPath& path) {
90     path.moveTo(3,0);
91     path.lineTo(6,2);
92     path.lineTo(0,2);
93     path.close();
94 }
95 
96 #if DEBUG_UNUSED
addOuterCCWTriangle(SkPath & path)97 static void addOuterCCWTriangle(SkPath& path) {
98     path.moveTo(3,0);
99     path.lineTo(0,2);
100     path.lineTo(6,2);
101     path.close();
102 }
103 #endif
104 
testLine2()105 static void testLine2() {
106     SkPath path;
107     addInnerCWTriangle(path);
108     addOuterCWTriangle(path);
109     test(path, 0, 3);
110 }
111 
testLine3()112 static void testLine3() {
113     SkPath path;
114     addInnerCWTriangle(path);
115     addOuterCWTriangle(path);
116     test(path, 3, 0);
117 }
118 
testLine4()119 static void testLine4() {
120     SkPath path;
121     addInnerCWTriangle(path);
122     addOuterCWTriangle(path);
123     test(path, 3, 2);
124 }
125 
126 static void (*tests[])() = {
127     testLine1,
128     testLine2,
129     testLine3,
130     testLine4,
131 };
132 
133 static const size_t testCount = sizeof(tests) / sizeof(tests[0]);
134 
135 static void (*firstTest)() = 0;
136 static bool skipAll = false;
137 
SimplifyFindNext_Test()138 void SimplifyFindNext_Test() {
139     if (skipAll) {
140         return;
141     }
142     size_t index = 0;
143     if (firstTest) {
144         while (index < testCount && tests[index] != firstTest) {
145             ++index;
146         }
147     }
148     bool firstTestComplete = false;
149     for ( ; index < testCount; ++index) {
150         (*tests[index])();
151         firstTestComplete = true;
152     }
153 }
154