• 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 #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