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