| OLD | NEW |
| (Empty) |
| 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 c1Typ
e, | |
| 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 } | |
| OLD | NEW |