| Index: tests/PathOpsThreeWayTest.cpp
|
| diff --git a/tests/PathOpsThreeWayTest.cpp b/tests/PathOpsThreeWayTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..15d6e5492742ecfad34a0b5ed90a559e9281e3b2
|
| --- /dev/null
|
| +++ b/tests/PathOpsThreeWayTest.cpp
|
| @@ -0,0 +1,78 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +#include "SkIntersections.h"
|
| +#include "SkTDArray.h"
|
| +#include "Test.h"
|
| +
|
| +// check intersections for consistency
|
| +
|
| +struct Curve {
|
| + int ptCount;
|
| + SkDCubic curve; // largest can hold lines / quads/ cubics
|
| +};
|
| +
|
| +static const Curve testSet0[] = { // extracted from skpClip2
|
| + {4, {{{134,11414}, {131.990234,11414}, {130.32666,11415.4824}, {130.042755,11417.4131}}} },
|
| + {4, {{{130.042755,11417.4131}, {130.233124,11418.3193}, {131.037079,11419}, {132,11419}}} },
|
| + {4, {{{132,11419}, {130.895432,11419}, {130,11418.1045}, {130,11417}}} },
|
| +};
|
| +
|
| +static const Curve testSet1[] = { // extracted from cubicOp85i
|
| + {4, {{{3,4}, {1,5}, {4,3}, {6,4}}} },
|
| + {1, {{{6,4}, {3,4}}} },
|
| + {4, {{{3,4}, {4,6}, {4,3}, {5,1}}} },
|
| + {1, {{{5,1}, {3,4}}} },
|
| +};
|
| +
|
| +static const struct TestSet {
|
| + const Curve* tests;
|
| + int testCount;
|
| +} testSets[] = {
|
| + { testSet0, (int) SK_ARRAY_COUNT(testSet0) },
|
| + { testSet1, (int) SK_ARRAY_COUNT(testSet1) },
|
| +};
|
| +
|
| +static const int testSetsCount = (int) SK_ARRAY_COUNT(testSets);
|
| +
|
| +static void testSetTest(skiatest::Reporter* reporter, int index) {
|
| + const TestSet& testSet = testSets[index];
|
| + int testCount = testSet.testCount;
|
| + SkASSERT(testCount > 1);
|
| + SkTDArray<SkIntersections> combos;
|
| + for (int outer = 0; outer < testCount - 1; ++outer) {
|
| + const Curve& oTest = testSet.tests[outer];
|
| + for (int inner = outer + 1; inner < testCount; ++inner) {
|
| + const Curve& iTest = testSet.tests[inner];
|
| + SkIntersections* i = combos.append();
|
| + sk_bzero(i, sizeof(SkIntersections));
|
| + if (oTest.ptCount == 1 && iTest.ptCount == 1) {
|
| + i->intersect(*(const SkDLine*) &oTest.curve, *(const SkDLine*) &iTest.curve);
|
| + } else if (oTest.ptCount == 1 && iTest.ptCount == 4) {
|
| + i->intersect(iTest.curve, *(const SkDLine*) &oTest.curve);
|
| + } else if (oTest.ptCount == 4 && iTest.ptCount == 1) {
|
| + i->intersect(oTest.curve, *(const SkDLine*) &oTest.curve);
|
| + } else if (oTest.ptCount == 4 && iTest.ptCount == 4) {
|
| + i->intersectB(oTest.curve, iTest.curve);
|
| + } else {
|
| + SkASSERT(0);
|
| + }
|
| +// i->dump();
|
| + }
|
| + }
|
| +}
|
| +
|
| +DEF_TEST(PathOpsThreeWay, reporter) {
|
| + for (int index = 0; index < testSetsCount; ++index) {
|
| + testSetTest(reporter, index);
|
| + reporter->bumpTestCount();
|
| + }
|
| +}
|
| +
|
| +DEF_TEST(PathOpsThreeWayOneOff, reporter) {
|
| + int index = 1;
|
| + testSetTest(reporter, index);
|
| +}
|
|
|