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 #include "Simplify.h"
8
9 namespace SimplifyAddIntersectingTsTest {
10
11 #include "Simplify.cpp"
12
13 } // end of SimplifyAddIntersectingTsTest namespace
14 /*
15 * Copyright 2012 Google Inc.
16 *
17 * Use of this source code is governed by a BSD-style license that can be
18 * found in the LICENSE file.
19 */
20
21 #include "Intersection_Tests.h"
22
23 static const SkPoint lines[][2] = {
24 {{ 1, 1}, { 1, 1}}, // degenerate
25 {{ 1, 1}, { 4, 1}}, // horizontal
26 {{ 4, 1}, { 9, 1}},
27 {{ 2, 1}, { 3, 1}},
28 {{ 2, 1}, { 6, 1}},
29 {{ 5, 1}, { 9, 1}},
30 {{ 1, 1}, { 1, 4}}, // vertical
31 {{ 1, 2}, { 1, 3}},
32 {{ 1, 2}, { 1, 6}},
33 {{ 1, 5}, { 1, 9}},
34 {{ 1, 1}, { 3, 3}}, // diagonal
35 {{ 2, 2}, { 4, 4}},
36 {{ 2, 4}, { 4, 2}},
37 };
38
39 static const size_t lineCount = sizeof(lines) / sizeof(lines[0]);
40
41 static const SkPoint quads[][3] = {
42 {{ 1, 1}, { 1, 1}, { 1, 1}}, // degenerate
43 {{ 1, 1}, { 4, 1}, { 5, 1}}, // line
44 {{ 1, 1}, { 4, 1}, { 4, 4}}, // curve
45 };
46
47 static const size_t quadCount = sizeof(quads) / sizeof(quads[0]);
48
49 static const SkPoint cubics[][4] = {
50 {{ 1, 1}, { 1, 1}, { 1, 1}, { 1, 1}}, // degenerate
51 {{ 1, 1}, { 4, 1}, { 5, 1}, { 6, 1}}, // line
52 {{ 1, 1}, { 3, 1}, { 4, 2}, { 4, 4}}, // curve
53 };
54
55 static const size_t cubicCount = sizeof(cubics) / sizeof(cubics[0]);
56 static const size_t testCount = lineCount + quadCount + cubicCount;
57
setPath(size_t outer,SkPath & path,const SkPoint * & pts1)58 static SkPath::Verb setPath(size_t outer, SkPath& path, const SkPoint*& pts1) {
59 SkPath::Verb c1Type;
60 if (outer < lineCount) {
61 path.moveTo(lines[outer][0].fX, lines[outer][0].fY);
62 path.lineTo(lines[outer][1].fX, lines[outer][1].fY);
63 c1Type = SkPath::kLine_Verb;
64 pts1 = lines[outer];
65 } else {
66 outer -= lineCount;
67 if (outer < quadCount) {
68 path.moveTo(quads[outer][0].fX, quads[outer][0].fY);
69 path.quadTo(quads[outer][1].fX, quads[outer][1].fY,
70 quads[outer][2].fX, quads[outer][2].fY);
71 c1Type = SkPath::kQuad_Verb;
72 pts1 = quads[outer];
73 } else {
74 outer -= quadCount;
75 path.moveTo(cubics[outer][0].fX, cubics[outer][0].fY);
76 path.cubicTo(cubics[outer][1].fX, cubics[outer][1].fY,
77 cubics[outer][2].fX, cubics[outer][2].fY,
78 cubics[outer][3].fX, cubics[outer][3].fY);
79 c1Type = SkPath::kCubic_Verb;
80 pts1 = cubics[outer];
81 }
82 }
83 return c1Type;
84 }
85
testPath(const SkPath & path,const SkPoint * pts1,SkPath::Verb c1Type,const SkPoint * pts2,SkPath::Verb c2Type)86 static void testPath(const SkPath& path, const SkPoint* pts1, SkPath::Verb c1Type,
87 const SkPoint* pts2, SkPath::Verb c2Type) {
88 SkTArray<SimplifyAddIntersectingTsTest::Contour> contour;
89 SimplifyAddIntersectingTsTest::EdgeBuilder builder(path, contour);
90 if (contour.count() < 2) {
91 return;
92 }
93 SimplifyAddIntersectingTsTest::Contour& c1 = contour[0];
94 SimplifyAddIntersectingTsTest::Contour& c2 = contour[1];
95 addIntersectTs(&c1, &c2);
96 #if DEBUG_DUMP
97 bool c1Intersected = c1.segments()[0].intersected();
98 // bool c2Intersected = c2.fSegments[0].intersected();
99 SkDebugf("%s %s (%1.9g,%1.9g %1.9g,%1.9g) %s %s (%1.9g,%1.9g %1.9g,%1.9g)\n",
100 __FUNCTION__, SimplifyAddIntersectingTsTest::kLVerbStr[c1Type],
101 pts1[0].fX, pts1[0].fY,
102 pts1[c1Type].fX, pts1[c1Type].fY,
103 c1Intersected ? "intersects" : "does not intersect",
104 SimplifyAddIntersectingTsTest::kLVerbStr[c2Type],
105 pts2[0].fX, pts2[0].fY,
106 pts2[c2Type].fX, pts2[c2Type].fY);
107 if (c1Intersected) {
108 c1.dump();
109 c2.dump();
110 }
111 #endif
112 }
113
114 static const size_t firstO = 6;
115 static const size_t firstI = 1;
116
SimplifyAddIntersectingTs_Test()117 void SimplifyAddIntersectingTs_Test() {
118 const SkPoint* pts1, * pts2;
119 if (firstO > 0 || firstI > 0) {
120 SkPath path;
121 SkPath::Verb c1Type = setPath(firstO, path, pts1);
122 SkPath path2(path);
123 SkPath::Verb c2Type = setPath(firstI, path2, pts2);
124 testPath(path2, pts1, c1Type, pts2, c2Type);
125 }
126 for (size_t o = 0; o < testCount; ++o) {
127 SkPath path;
128 SkPath::Verb c1Type = setPath(o, path, pts1);
129 for (size_t i = 0; i < testCount; ++i) {
130 SkPath path2(path);
131 SkPath::Verb c2Type = setPath(i, path2, pts2);
132 testPath(path2, pts1, c1Type, pts2, c2Type);
133 }
134 }
135 }
136