| Index: tests/PathOpsOpTest.cpp
|
| diff --git a/tests/PathOpsOpTest.cpp b/tests/PathOpsOpTest.cpp
|
| index 2e54d5af9808c352941378cee10ed77cf24f2a37..f4a115b22343a1b38eebf79857963b1a84345a93 100644
|
| --- a/tests/PathOpsOpTest.cpp
|
| +++ b/tests/PathOpsOpTest.cpp
|
| @@ -3825,7 +3825,8 @@ static void cubicOp130(skiatest::Reporter* reporter, const char* filename) {
|
|
|
| static void complex_to_quads(const SkPoint pts[], SkPath* path) {
|
| SkScalar loopT;
|
| - if (SkDCubic::ComplexBreak(pts, &loopT)) {
|
| + SkDCubic::CubicType dType;
|
| + if (SkDCubic::ComplexBreak(pts, &loopT, &dType)) {
|
| SkPoint cubicPair[7];
|
| SkChopCubicAt(pts, cubicPair, loopT);
|
| SkDCubic c1, c2;
|
| @@ -4018,11 +4019,284 @@ static void cubicOp132(skiatest::Reporter* reporter, const char* filename) {
|
| testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| }
|
|
|
| +static void loop12(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(1,2);
|
| + path.cubicTo(0,6, -3.16666675f,3.66666675f, 6.33333349f,3.33333349f);
|
| + path.close();
|
| + pathB.moveTo(0,6);
|
| + pathB.cubicTo(-3.16666675f,3.66666675f, 6.33333349f,3.33333349f, 1,2);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void loop15(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(2,6);
|
| + path.cubicTo(1,2, 7.16666698f,6.66666698f, -4.66666651f,7.66666651f);
|
| + path.close();
|
| + pathB.moveTo(1,2);
|
| + pathB.cubicTo(7.16666698f,6.66666698f, -4.66666651f,7.66666651f, 2,6);
|
| + pathB.close();
|
| + testPathOpCheck(reporter, path, pathB, kIntersect_SkPathOp, filename, FLAGS_runFail);
|
| +}
|
| +
|
| +// lots of loopy interesections -- all points appear to be present -- needs more investigation
|
| +static void loop16(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(1,5);
|
| + path.cubicTo(0,1, 7.33333302f,5.33333349f, -7,7);
|
| + path.close();
|
| + pathB.moveTo(0,1);
|
| + pathB.cubicTo(7.33333302f,5.33333349f, -7,7, 1,5);
|
| + pathB.close();
|
| + testPathOpCheck(reporter, path, pathB, kIntersect_SkPathOp, filename, FLAGS_runFail);
|
| +}
|
| +
|
| +static void cubicOp133(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(5,6);
|
| + path.cubicTo(5,6, 5,0, 4,1);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0,5);
|
| + pathB.cubicTo(1,4, 6,5, 6,5);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubicOp134(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(5,6);
|
| + path.cubicTo(5,6, 6,0, 3,1);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0,6);
|
| + pathB.cubicTo(1,3, 6,5, 6,5);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubicOp135(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(5,6);
|
| + path.cubicTo(5,6, 6,0, 4,1);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0,6);
|
| + pathB.cubicTo(1,4, 6,5, 6,5);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubicOp136(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(5,6);
|
| + path.cubicTo(5,6, 5,0, 3,1);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0,5);
|
| + pathB.cubicTo(1,3, 6,5, 6,5);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubicOp136a(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(5,6);
|
| + path.quadTo(5,0, 3,1);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0,5);
|
| + pathB.cubicTo(1,3, 6,5, 6,5);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubics137(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(0, 5);
|
| + path.cubicTo(3, 6, 1, 0, 3, 2);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0, 1);
|
| + pathB.cubicTo(2, 3, 5, 0, 6, 3);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubics138(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(0, 5);
|
| + path.cubicTo(3, 6, 1, 0, 4, 2);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0, 1);
|
| + pathB.cubicTo(2, 4, 5, 0, 6, 3);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +// three curves intersect successfully nearby -- the angle only gets 2 of the 3 pts
|
| +static void cubicOp139(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(0,2);
|
| + path.cubicTo(0,4, 3,1, 5,1);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(1,3);
|
| + pathB.cubicTo(1,5, 2,0, 4,0);
|
| + pathB.close();
|
| + testPathOpCheck(reporter, path, pathB, kDifference_SkPathOp, filename, FLAGS_runFail);
|
| +}
|
| +
|
| +static void cubicOp140(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(0,2);
|
| + path.cubicTo(1,2, 5,4, 3,2);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(4,5);
|
| + pathB.cubicTo(2,3, 2,0, 2,1);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void cubicOp141(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(0,2);
|
| + path.cubicTo(1,2, 6,4, 3,2);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(4,6);
|
| + pathB.cubicTo(2,3, 2,0, 2,1);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kDifference_SkPathOp, filename);
|
| +}
|
| +
|
| +static void quadRect1(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(6,15);
|
| + path.quadTo(16,0, 8,4);
|
| + path.quadTo(2,7, 12,12);
|
| + path.close();
|
| + pathB.addRect(4,11, 13,16);
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void quadRect2(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(5,12);
|
| + path.quadTo(15,7, 9,4);
|
| + path.quadTo(1,0, 11,15);
|
| + path.close();
|
| + pathB.addRect(4,11, 13,16);
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void quadRect3(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(12,12);
|
| + path.quadTo(2,7, 8,4);
|
| + path.quadTo(16,0, 6,15);
|
| + path.close();
|
| + pathB.addRect(4,11, 13,16);
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void quadRect4(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(11,15);
|
| + path.quadTo(1,0, 9,4);
|
| + path.quadTo(15,7, 5,12);
|
| + path.close();
|
| + pathB.addRect(4,11, 13,16);
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void quadRect5(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(11,13);
|
| + path.quadTo(4,4, 8,4);
|
| + path.quadTo(12,4, 5,13);
|
| + path.close();
|
| + pathB.addRect(4,11, 13,16);
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void quadRect6(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.moveTo(5,13);
|
| + path.quadTo(12,4, 8,4);
|
| + path.quadTo(4,4, 11,13);
|
| + path.close();
|
| + pathB.addRect(4,11, 13,16);
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void loops4i(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(0, 3);
|
| + path.cubicTo(0, 2, 0, 2, -1.66666663f, 2.16666675f);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0, 2);
|
| + pathB.cubicTo(0, 2, -1.66666663f, 2.16666675f, 0, 3);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| +static void loops5i(skiatest::Reporter* reporter, const char* filename) {
|
| + SkPath path, pathB;
|
| + path.setFillType(SkPath::kWinding_FillType);
|
| + path.moveTo(1, 2);
|
| + path.cubicTo(0, 2, 0, 2, 0.166666672f, 2.66666675f);
|
| + path.close();
|
| + pathB.setFillType(SkPath::kWinding_FillType);
|
| + pathB.moveTo(0, 2);
|
| + pathB.cubicTo(0, 2, 0.166666672f, 2.66666675f, 1, 2);
|
| + pathB.close();
|
| + testPathOp(reporter, path, pathB, kIntersect_SkPathOp, filename);
|
| +}
|
| +
|
| static void (*skipTest)(skiatest::Reporter* , const char* filename) = 0;
|
| static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0;
|
| static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0;
|
|
|
| static struct TestDesc tests[] = {
|
| + TEST(loops4i),
|
| + TEST(quadRect1),
|
| + TEST(quadRect2),
|
| + TEST(quadRect3),
|
| + TEST(quadRect4),
|
| + TEST(quadRect5),
|
| + TEST(quadRect6),
|
| + TEST(cubicOp141),
|
| + TEST(cubicOp58d),
|
| + TEST(loops5i),
|
| + TEST(cubicOp140),
|
| + TEST(cubicOp139),
|
| + TEST(cubics138),
|
| + TEST(cubics137),
|
| + TEST(cubicOp136a),
|
| + TEST(cubicOp136),
|
| + TEST(cubicOp135),
|
| + TEST(cubicOp134),
|
| + TEST(cubicOp133),
|
| + TEST(loop16),
|
| + TEST(loop15),
|
| + TEST(loop12),
|
| TEST(cubicOp132),
|
| TEST(loop11),
|
| TEST(loop10),
|
| @@ -4063,7 +4337,7 @@ static struct TestDesc tests[] = {
|
| TEST(testRect1),
|
| TEST(cubicOp115),
|
| TEST(issue2753),
|
| - TEST(cubicOp114), // FIXME: curve with inflection is ordered the wrong way
|
| + TEST(cubicOp114),
|
| TEST(issue2808),
|
| TEST(cubicOp114asQuad),
|
| TEST(rects4),
|
| @@ -4190,7 +4464,6 @@ static struct TestDesc tests[] = {
|
| TEST(cubicOp61d),
|
| TEST(cubicOp60d),
|
| TEST(cubicOp59d),
|
| - TEST(cubicOp58d),
|
| TEST(cubicOp57d),
|
| TEST(cubicOp56d),
|
| TEST(cubicOp55d),
|
| @@ -4276,8 +4549,84 @@ static struct TestDesc tests[] = {
|
| static const size_t testCount = SK_ARRAY_COUNT(tests);
|
|
|
| static struct TestDesc subTests[] = {
|
| - TEST(cubicOp58d),
|
| - TEST(cubicOp53d),
|
| + TEST(loop16),
|
| + TEST(loop15),
|
| + TEST(loop12),
|
| + TEST(cubicOp132),
|
| + TEST(loop11),
|
| + TEST(loop10),
|
| + TEST(circlesOp3),
|
| + TEST(loop9),
|
| + TEST(loop8),
|
| + TEST(rects5),
|
| + TEST(loop7),
|
| + TEST(cubicOp130a),
|
| + TEST(rRect1x),
|
| + TEST(circlesOp2),
|
| + TEST(circlesOp1),
|
| + TEST(cubicOp131),
|
| + TEST(cubicOp130),
|
| + TEST(cubicOp129),
|
| + TEST(cubicOp128),
|
| + TEST(cubicOp127),
|
| + TEST(cubicOp126),
|
| + TEST(cubicOp125),
|
| + TEST(cubicOp124),
|
| + TEST(loop6),
|
| + TEST(loop5),
|
| + TEST(cubicOp123),
|
| + TEST(cubicOp122),
|
| + TEST(cubicOp121),
|
| + TEST(cubicOp120),
|
| + TEST(cubicOp119),
|
| + TEST(loop4),
|
| + TEST(loop3),
|
| + TEST(loop2),
|
| + TEST(loop1asQuad),
|
| + TEST(loop1),
|
| + TEST(issue3517),
|
| + TEST(cubicOp118),
|
| + TEST(cubicOp117),
|
| + TEST(cubicOp116),
|
| + TEST(testRect2),
|
| + TEST(testRect1),
|
| + TEST(cubicOp115),
|
| + TEST(issue2753),
|
| + TEST(cubicOp114),
|
| + TEST(issue2808),
|
| + TEST(cubicOp114asQuad),
|
| + TEST(rects4),
|
| + TEST(rects3),
|
| + TEST(rects2),
|
| + TEST(rects1),
|
| + TEST(issue2540),
|
| + TEST(issue2504),
|
| + TEST(kari1),
|
| + TEST(quadOp10i),
|
| + TEST(cubicOp113),
|
| + TEST(skpcarrot_is24),
|
| + TEST(issue1417),
|
| + TEST(cubicOp112),
|
| + TEST(skpadspert_net23),
|
| + TEST(skpadspert_de11),
|
| + TEST(findFirst1),
|
| + TEST(xOp2i),
|
| + TEST(xOp3i),
|
| + TEST(xOp1u),
|
| + TEST(xOp1i),
|
| + TEST(cubicOp111),
|
| + TEST(cubicOp110),
|
| + TEST(cubicOp109),
|
| + TEST(cubicOp108),
|
| + TEST(cubicOp107),
|
| + TEST(cubicOp106),
|
| + TEST(cubicOp105),
|
| + TEST(cubicOp104),
|
| + TEST(cubicOp103),
|
| + TEST(cubicOp102),
|
| + TEST(cubicOp101),
|
| + TEST(cubicOp100),
|
| + TEST(cubicOp99),
|
| };
|
|
|
| static const size_t subTestCount = SK_ARRAY_COUNT(subTests);
|
| @@ -4285,7 +4634,7 @@ static const size_t subTestCount = SK_ARRAY_COUNT(subTests);
|
| static void (*firstSubTest)(skiatest::Reporter* , const char* filename) = 0;
|
|
|
| static bool runSubTests = false;
|
| -static bool runSubTestsFirst = false;
|
| +static bool runSubTestsFirst = true;
|
| static bool runReverse = false;
|
|
|
| DEF_TEST(PathOpsOp, reporter) {
|
|
|