diff options
author | caryclark <caryclark@google.com> | 2014-06-17 05:15:38 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-06-17 05:15:38 -0700 |
commit | dac1d17027dcaa5596885a9f333979418b35001c (patch) | |
tree | 923c6ca762654144254565240de5e9ec6598c41f /tests | |
parent | d6043b20b63f895d384b4794205ac914abfafa71 (diff) |
Enabling the canvas bit to turn the clip stack into a flat replace exposed around 100 failures when testing the 800K skp set generated from the top 1M web sites.
This fixes all but one of those failures.
Major changes include:
- Replace angle indices with angle pointers. This was motivated by the need to add angles later but not renumber existing angles.
- Aggressive segment chase. When the winding is known on a segment, more aggressively passing that winding to adjacent segments allows fragmented data sets to succeed.
- Line segments with ends nearly the same are treated as coincident first.
- Transfer partial coincidence by observing that if segment A is partially coincident to B and C then B and C may be partially coincident.
TBR=reed
Author: caryclark@google.com
Review URL: https://codereview.chromium.org/272153002
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/PathOpsAngleIdeas.cpp | 6 | ||||
-rw-r--r-- | tests/PathOpsAngleTest.cpp | 8 | ||||
-rw-r--r-- | tests/PathOpsCubicIntersectionTest.cpp | 3 | ||||
-rwxr-xr-x | tests/PathOpsDebug.cpp | 304 | ||||
-rw-r--r-- | tests/PathOpsExtendedTest.cpp | 11 | ||||
-rw-r--r-- | tests/PathOpsLineIntersectionTest.cpp | 10 | ||||
-rw-r--r-- | tests/PathOpsOpTest.cpp | 114 | ||||
-rw-r--r-- | tests/PathOpsSimplifyTest.cpp | 19 | ||||
-rwxr-xr-x | tests/PathOpsSkpClipTest.cpp | 548 | ||||
-rwxr-xr-x | tests/PathOpsSkpTest.cpp | 701 |
10 files changed, 1476 insertions, 248 deletions
diff --git a/tests/PathOpsAngleIdeas.cpp b/tests/PathOpsAngleIdeas.cpp index 2887b28feb..901cab2bb5 100755 --- a/tests/PathOpsAngleIdeas.cpp +++ b/tests/PathOpsAngleIdeas.cpp @@ -426,7 +426,8 @@ static void testQuadAngles(skiatest::Reporter* reporter, const SkDQuad& quad1, c SkOpSegment seg[2]; makeSegment(quad1, shortQuads[0], &seg[0]); makeSegment(quad2, shortQuads[1], &seg[1]); - int realOverlap = PathOpsAngleTester::ConvexHullOverlaps(seg[0].angle(0), seg[1].angle(0)); + int realOverlap = PathOpsAngleTester::ConvexHullOverlaps(*seg[0].debugLastAngle(), + *seg[1].debugLastAngle()); const SkDPoint& origin = quad1[0]; REPORTER_ASSERT(reporter, origin == quad2[0]); double a1s = atan2(origin.fY - quad1[1].fY, quad1[1].fX - origin.fX); @@ -544,7 +545,8 @@ static void testQuadAngles(skiatest::Reporter* reporter, const SkDQuad& quad1, c } if (overlap < 0) { SkDEBUGCODE(int realEnds =) - PathOpsAngleTester::EndsIntersect(seg[0].angle(0), seg[1].angle(0)); + PathOpsAngleTester::EndsIntersect(*seg[0].debugLastAngle(), + *seg[1].debugLastAngle()); SkASSERT(realEnds == (firstInside ? 1 : 0)); } bruteForce(reporter, quad1, quad2, firstInside); diff --git a/tests/PathOpsAngleTest.cpp b/tests/PathOpsAngleTest.cpp index 1aae27a847..faf61584e6 100644 --- a/tests/PathOpsAngleTest.cpp +++ b/tests/PathOpsAngleTest.cpp @@ -264,7 +264,7 @@ DEF_TEST(PathOpsAngleCircle, reporter) { break; } } - PathOpsAngleTester::Orderable(segment[0].angle(0), segment[1].angle(0)); + PathOpsAngleTester::Orderable(*segment[0].debugLastAngle(), *segment[1].debugLastAngle()); } struct IntersectData { @@ -438,9 +438,9 @@ DEF_TEST(PathOpsAngleAfter, reporter) { } break; } } - SkOpAngle& angle1 = const_cast<SkOpAngle&>(segment[0].angle(0)); - SkOpAngle& angle2 = const_cast<SkOpAngle&>(segment[1].angle(0)); - SkOpAngle& angle3 = const_cast<SkOpAngle&>(segment[2].angle(0)); + SkOpAngle& angle1 = *const_cast<SkOpAngle*>(segment[0].debugLastAngle()); + SkOpAngle& angle2 = *const_cast<SkOpAngle*>(segment[1].debugLastAngle()); + SkOpAngle& angle3 = *const_cast<SkOpAngle*>(segment[2].debugLastAngle()); PathOpsAngleTester::SetNext(angle1, angle3); // These data sets are seeded when the set itself fails, so likely the dataset does not // match the expected result. The tests above return 1 when first added, but diff --git a/tests/PathOpsCubicIntersectionTest.cpp b/tests/PathOpsCubicIntersectionTest.cpp index 17b3f07d3a..b6a9e5910a 100644 --- a/tests/PathOpsCubicIntersectionTest.cpp +++ b/tests/PathOpsCubicIntersectionTest.cpp @@ -162,6 +162,9 @@ static const SkDCubic testSet[] = { const int testSetCount = (int) SK_ARRAY_COUNT(testSet); static const SkDCubic newTestSet[] = { +{{{980.9000244140625, 1474.3280029296875}, {980.9000244140625, 1474.3280029296875}, {978.89300537109375, 1471.95703125}, {981.791015625, 1469.487060546875}}}, +{{{981.791015625, 1469.487060546875}, {981.791015625, 1469.4859619140625}, {983.3580322265625, 1472.72900390625}, {980.9000244140625, 1474.3280029296875}}}, + {{{275,532}, {277.209137,532}, {279,530.209106}, {279,528}}}, {{{278,529}, {278,530.65686}, {276.65686,532}, {275,532}}}, diff --git a/tests/PathOpsDebug.cpp b/tests/PathOpsDebug.cpp index d53271af4d..a2b48acddc 100755 --- a/tests/PathOpsDebug.cpp +++ b/tests/PathOpsDebug.cpp @@ -34,25 +34,69 @@ void SkPathOpsDebug::WindingPrintf(int wind) { #endif void SkOpAngle::dump() const { -#if DEBUG_SORT - debugOne(false); -#endif + dumpOne(true); SkDebugf("\n"); } -void SkOpAngle::dumpFromTo(const SkOpSegment* segment, int from, int to) const { -#if DEBUG_SORT && DEBUG_ANGLE +void SkOpAngle::dumpOne(bool functionHeader) const { +// fSegment->debugValidate(); + const SkOpSpan& mSpan = fSegment->span(SkMin32(fStart, fEnd)); + if (functionHeader) { + SkDebugf("%s ", __FUNCTION__); + } + SkDebugf("[%d", fSegment->debugID()); + SkDebugf("/%d", debugID()); + SkDebugf("] next="); + if (fNext) { + SkDebugf("%d", fNext->fSegment->debugID()); + SkDebugf("/%d", fNext->debugID()); + } else { + SkDebugf("?"); + } + SkDebugf(" sect=%d/%d ", fSectorStart, fSectorEnd); + SkDebugf(" s=%1.9g [%d] e=%1.9g [%d]", fSegment->span(fStart).fT, fStart, + fSegment->span(fEnd).fT, fEnd); + SkDebugf(" sgn=%d windVal=%d", sign(), mSpan.fWindValue); + + SkDebugf(" windSum="); + SkPathOpsDebug::WindingPrintf(mSpan.fWindSum); + if (mSpan.fOppValue != 0 || mSpan.fOppSum != SK_MinS32) { + SkDebugf(" oppVal=%d", mSpan.fOppValue); + SkDebugf(" oppSum="); + SkPathOpsDebug::WindingPrintf(mSpan.fOppSum); + } + if (mSpan.fDone) { + SkDebugf(" done"); + } + if (unorderable()) { + SkDebugf(" unorderable"); + } + if (small()) { + SkDebugf(" small"); + } + if (mSpan.fTiny) { + SkDebugf(" tiny"); + } + if (fSegment->operand()) { + SkDebugf(" operand"); + } + if (fStop) { + SkDebugf(" stop"); + } +} + +void SkOpAngle::dumpTo(const SkOpSegment* segment, const SkOpAngle* to) const { const SkOpAngle* first = this; const SkOpAngle* next = this; const char* indent = ""; do { SkDebugf("%s", indent); - next->debugOne(false); + next->dumpOne(false); if (segment == next->fSegment) { - if (fNext && from == fNext->debugID()) { + if (this == fNext) { SkDebugf(" << from"); } - if (fNext && to == fNext->debugID()) { + if (to == fNext) { SkDebugf(" << to"); } } @@ -60,7 +104,6 @@ void SkOpAngle::dumpFromTo(const SkOpSegment* segment, int from, int to) const { indent = " "; next = next->fNext; } while (next && next != first); -#endif } void SkOpAngle::dumpLoop() const { @@ -81,6 +124,14 @@ void SkOpAngle::dumpPartials() const { } while (next && next != first); } +void SkOpAngleSet::dump() const { + // FIXME: unimplemented +/* This requires access to the internal SkChunkAlloc data + Defer implementing this until it is needed for debugging +*/ + SkASSERT(0); +} + void SkOpContour::dump() const { int segmentCount = fSegments.count(); SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); @@ -99,6 +150,50 @@ void SkOpContour::dumpAngles() const { } } +void SkOpContour::dumpCoincidence(const SkCoincidence& coin) const { + int thisIndex = coin.fSegments[0]; + const SkOpSegment& s1 = fSegments[thisIndex]; + int otherIndex = coin.fSegments[1]; + const SkOpSegment& s2 = coin.fOther->fSegments[otherIndex]; + SkDebugf("((SkOpSegment*) 0x%p) [%d] ((SkOpSegment*) 0x%p) [%d]\n", &s1, s1.debugID(), + &s2, s2.debugID()); + for (int index = 0; index < 2; ++index) { + SkDebugf(" {%1.9gf, %1.9gf}", coin.fPts[0][index].fX, coin.fPts[0][index].fY); + if (coin.fNearly[index]) { + SkDebugf(" {%1.9gf, %1.9gf}", coin.fPts[1][index].fX, coin.fPts[1][index].fY); + } + SkDebugf(" seg1t=%1.9g seg2t=%1.9g\n", coin.fTs[0][index], coin.fTs[1][index]); + } +} + +void SkOpContour::dumpCoincidences() const { + int count = fCoincidences.count(); + if (count > 0) { + SkDebugf("fCoincidences count=%d\n", count); + for (int test = 0; test < count; ++test) { + dumpCoincidence(fCoincidences[test]); + } + } + count = fPartialCoincidences.count(); + if (count == 0) { + return; + } + SkDebugf("fPartialCoincidences count=%d\n", count); + for (int test = 0; test < count; ++test) { + dumpCoincidence(fPartialCoincidences[test]); + } +} + +void SkOpContour::dumpPt(int index) const { + int segmentCount = fSegments.count(); + for (int test = 0; test < segmentCount; ++test) { + const SkOpSegment& segment = fSegments[test]; + if (segment.debugID() == index) { + fSegments[test].dumpPts(); + } + } +} + void SkOpContour::dumpPts() const { int segmentCount = fSegments.count(); SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); @@ -108,6 +203,16 @@ void SkOpContour::dumpPts() const { } } +void SkOpContour::dumpSpan(int index) const { + int segmentCount = fSegments.count(); + for (int test = 0; test < segmentCount; ++test) { + const SkOpSegment& segment = fSegments[test]; + if (segment.debugID() == index) { + fSegments[test].dumpSpans(); + } + } +} + void SkOpContour::dumpSpans() const { int segmentCount = fSegments.count(); SkDebugf("((SkOpContour*) 0x%p) [%d]\n", this, debugID()); @@ -208,25 +313,24 @@ const SkTDArray<SkOpSpan>& SkOpSegment::debugSpans() const { void SkOpSegment::dumpAngles() const { SkDebugf("((SkOpSegment*) 0x%p) [%d]\n", this, debugID()); - int fromIndex = -1, toIndex = -1; + const SkOpAngle* fromAngle = NULL; + const SkOpAngle* toAngle = NULL; for (int index = 0; index < count(); ++index) { - int fIndex = fTs[index].fFromAngleIndex; - int tIndex = fTs[index].fToAngleIndex; - if (fromIndex == fIndex && tIndex == toIndex) { + const SkOpAngle* fAngle = fTs[index].fFromAngle; + const SkOpAngle* tAngle = fTs[index].fToAngle; + if (fromAngle == fAngle && toAngle == tAngle) { continue; } - if (fIndex >= 0) { - SkDebugf(" [%d] from=%d ", index, fIndex); - const SkOpAngle& angle = this->angle(fIndex); - angle.dumpFromTo(this, fIndex, tIndex); + if (fAngle) { + SkDebugf(" [%d] from=%d ", index, fAngle->debugID()); + fAngle->dumpTo(this, tAngle); } - if (tIndex >= 0) { - SkDebugf(" [%d] to=%d ", index, tIndex); - const SkOpAngle& angle = this->angle(tIndex); - angle.dumpFromTo(this, fIndex, tIndex); + if (tAngle) { + SkDebugf(" [%d] to=%d ", index, tAngle->debugID()); + tAngle->dumpTo(this, fAngle); } - fromIndex = fIndex; - toIndex = tIndex; + fromAngle = fAngle; + toAngle = tAngle; } } @@ -279,17 +383,17 @@ void SkOpSegment::dumpSpans() const { } } -void SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle, true>& angles) { - int count = angles.count(); +void SkPathOpsDebug::DumpCoincidence(const SkTArray<SkOpContour, true>& contours) { + int count = contours.count(); for (int index = 0; index < count; ++index) { - angles[index].dump(); + contours[index].dumpCoincidences(); } } -void SkPathOpsDebug::DumpAngles(const SkTArray<SkOpAngle* , true>& angles) { - int count = angles.count(); +void SkPathOpsDebug::DumpCoincidence(const SkTArray<SkOpContour* , true>& contours) { + int count = contours.count(); for (int index = 0; index < count; ++index) { - angles[index]->dump(); + contours[index]->dumpCoincidences(); } } @@ -335,6 +439,20 @@ void SkPathOpsDebug::DumpContourPts(const SkTArray<SkOpContour* , true>& contour } } +void SkPathOpsDebug::DumpContourPt(const SkTArray<SkOpContour, true>& contours, int segmentID) { + int count = contours.count(); + for (int index = 0; index < count; ++index) { + contours[index].dumpPt(segmentID); + } +} + +void SkPathOpsDebug::DumpContourPt(const SkTArray<SkOpContour* , true>& contours, int segmentID) { + int count = contours.count(); + for (int index = 0; index < count; ++index) { + contours[index]->dumpPt(segmentID); + } +} + void SkPathOpsDebug::DumpContourSpans(const SkTArray<SkOpContour, true>& contours) { int count = contours.count(); for (int index = 0; index < count; ++index) { @@ -349,6 +467,20 @@ void SkPathOpsDebug::DumpContourSpans(const SkTArray<SkOpContour* , true>& conto } } +void SkPathOpsDebug::DumpContourSpan(const SkTArray<SkOpContour, true>& contours, int segmentID) { + int count = contours.count(); + for (int index = 0; index < count; ++index) { + contours[index].dumpSpan(segmentID); + } +} + +void SkPathOpsDebug::DumpContourSpan(const SkTArray<SkOpContour* , true>& contours, int segmentID) { + int count = contours.count(); + for (int index = 0; index < count; ++index) { + contours[index]->dumpSpan(segmentID); + } +} + void SkPathOpsDebug::DumpSpans(const SkTDArray<SkOpSpan *>& spans) { int count = spans.count(); for (int index = 0; index < count; ++index) { @@ -400,33 +532,45 @@ void SkOpSpan::dumpOne() const { } else { SkDebugf(" other.fID=? [?] otherT=?"); } -#if DEBUG_WINDING - SkDebugf(" windSum="); - SkPathOpsDebug::WindingPrintf(fWindSum); -#endif - if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { -#if DEBUG_WINDING - SkDebugf(" oppSum="); - SkPathOpsDebug::WindingPrintf(fOppSum); -#endif + if (fWindSum != SK_MinS32) { + SkDebugf(" windSum=%d", fWindSum); + } + if (fOppSum != SK_MinS32 && (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0)) { + SkDebugf(" oppSum=%d", fOppSum); } SkDebugf(" windValue=%d", fWindValue); if (SkPathOpsDebug::ValidWind(fOppSum) || fOppValue != 0) { SkDebugf(" oppValue=%d", fOppValue); } - SkDebugf(" from=%d", fFromAngleIndex); - SkDebugf(" to=%d", fToAngleIndex); + if (fFromAngle && fFromAngle->debugID()) { + SkDebugf(" from=%d", fFromAngle->debugID()); + } + if (fToAngle && fToAngle->debugID()) { + SkDebugf(" to=%d", fToAngle->debugID()); + } + if (fChased) { + SkDebugf(" chased"); + } + if (fCoincident) { + SkDebugf(" coincident"); + } if (fDone) { SkDebugf(" done"); } - if (fTiny) { - SkDebugf(" tiny"); + if (fLoop) { + SkDebugf(" loop"); + } + if (fMultiple) { + SkDebugf(" multiple"); + } + if (fNear) { + SkDebugf(" near"); } if (fSmall) { SkDebugf(" small"); } - if (fLoop) { - SkDebugf(" loop"); + if (fTiny) { + SkDebugf(" tiny"); } SkDebugf("\n"); } @@ -444,22 +588,6 @@ void SkOpSpan::dump() const { dumpOne(); } -void Dump(const SkTArray<class SkOpAngle, true>& angles) { - SkPathOpsDebug::DumpAngles(angles); -} - -void Dump(const SkTArray<class SkOpAngle* , true>& angles) { - SkPathOpsDebug::DumpAngles(angles); -} - -void Dump(const SkTArray<class SkOpAngle, true>* angles) { - SkPathOpsDebug::DumpAngles(*angles); -} - -void Dump(const SkTArray<class SkOpAngle* , true>* angles) { - SkPathOpsDebug::DumpAngles(*angles); -} - void Dump(const SkTArray<class SkOpContour, true>& contours) { SkPathOpsDebug::DumpContours(contours); } @@ -476,12 +604,12 @@ void Dump(const SkTArray<class SkOpContour* , true>* contours) { SkPathOpsDebug::DumpContours(*contours); } -void Dump(const SkTDArray<SkOpSpan *>& chaseArray) { - SkPathOpsDebug::DumpSpans(chaseArray); +void Dump(const SkTDArray<SkOpSpan *>& chase) { + SkPathOpsDebug::DumpSpans(chase); } -void Dump(const SkTDArray<SkOpSpan *>* chaseArray) { - SkPathOpsDebug::DumpSpans(*chaseArray); +void Dump(const SkTDArray<SkOpSpan *>* chase) { + SkPathOpsDebug::DumpSpans(*chase); } void DumpAngles(const SkTArray<class SkOpContour, true>& contours) { @@ -500,6 +628,22 @@ void DumpAngles(const SkTArray<class SkOpContour* , true>* contours) { SkPathOpsDebug::DumpContourAngles(*contours); } +void DumpCoin(const SkTArray<class SkOpContour, true>& contours) { + SkPathOpsDebug::DumpCoincidence(contours); +} + +void DumpCoin(const SkTArray<class SkOpContour* , true>& contours) { + SkPathOpsDebug::DumpCoincidence(contours); +} + +void DumpCoin(const SkTArray<class SkOpContour, true>* contours) { + SkPathOpsDebug::DumpCoincidence(*contours); +} + +void DumpCoin(const SkTArray<class SkOpContour* , true>* contours) { + SkPathOpsDebug::DumpCoincidence(*contours); +} + void DumpSpans(const SkTArray<class SkOpContour, true>& contours) { SkPathOpsDebug::DumpContourSpans(contours); } @@ -516,6 +660,22 @@ void DumpSpans(const SkTArray<class SkOpContour* , true>* contours) { SkPathOpsDebug::DumpContourSpans(*contours); } +void DumpSpan(const SkTArray<class SkOpContour, true>& contours, int segmentID) { + SkPathOpsDebug::DumpContourSpan(contours, segmentID); +} + +void DumpSpan(const SkTArray<class SkOpContour* , true>& contours, int segmentID) { + SkPathOpsDebug::DumpContourSpan(contours, segmentID); +} + +void DumpSpan(const SkTArray<class SkOpContour, true>* contours, int segmentID) { + SkPathOpsDebug::DumpContourSpan(*contours, segmentID); +} + +void DumpSpan(const SkTArray<class SkOpContour* , true>* contours, int segmentID) { + SkPathOpsDebug::DumpContourSpan(*contours, segmentID); +} + void DumpPts(const SkTArray<class SkOpContour, true>& contours) { SkPathOpsDebug::DumpContourPts(contours); } @@ -532,6 +692,22 @@ void DumpPts(const SkTArray<class SkOpContour* , true>* contours) { SkPathOpsDebug::DumpContourPts(*contours); } +void DumpPt(const SkTArray<class SkOpContour, true>& contours, int segmentID) { + SkPathOpsDebug::DumpContourPt(contours, segmentID); +} + +void DumpPt(const SkTArray<class SkOpContour* , true>& contours, int segmentID) { + SkPathOpsDebug::DumpContourPt(contours, segmentID); +} + +void DumpPt(const SkTArray<class SkOpContour, true>* contours, int segmentID) { + SkPathOpsDebug::DumpContourPt(*contours, segmentID); +} + +void DumpPt(const SkTArray<class SkOpContour* , true>* contours, int segmentID) { + SkPathOpsDebug::DumpContourPt(*contours, segmentID); +} + static void dumpTestCase(const SkDQuad& quad1, const SkDQuad& quad2, int testNo) { SkDebugf("<div id=\"quad%d\">\n", testNo); quad1.dumpComma(","); diff --git a/tests/PathOpsExtendedTest.cpp b/tests/PathOpsExtendedTest.cpp index 280307a775..fe3d24d6a0 100644 --- a/tests/PathOpsExtendedTest.cpp +++ b/tests/PathOpsExtendedTest.cpp @@ -156,6 +156,11 @@ static void showPathData(const SkPath& path) { while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { switch (verb) { case SkPath::kMove_Verb: + if (firstPtSet && lastPtSet && firstPt != lastPt) { + SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", lastPt.fX, lastPt.fY, + firstPt.fX, firstPt.fY); + lastPtSet = false; + } firstPt = pts[0]; firstPtSet = true; continue; @@ -190,6 +195,10 @@ static void showPathData(const SkPath& path) { return; } } + if (firstPtSet && lastPtSet && firstPt != lastPt) { + SkDebugf("{{%1.9g,%1.9g}, {%1.9g,%1.9g}},\n", lastPt.fX, lastPt.fY, + firstPt.fX, firstPt.fY); + } } #endif @@ -410,7 +419,6 @@ static void showPathOpPath(const char* testName, const SkPath& one, const SkPath SkDebugf("static void %s(skiatest::Reporter* reporter, const char* filename) {\n", testName); *gTestOp.append() = shapeOp; ++gTestNo; - SkDebugf("\n*** this test fails ***\n"); SkDebugf(" SkPath path, pathB;\n"); showPath(a, "path", false); showPath(b, "pathB", false); @@ -440,6 +448,7 @@ static int comparePaths(skiatest::Reporter* reporter, const char* testName, cons if (errors2x2 > MAX_ERRORS && gComparePathsAssert) { SK_DECLARE_STATIC_MUTEX(compareDebugOut3); SkAutoMutexAcquire autoM(compareDebugOut3); + SkDebugf("\n*** this test fails ***\n"); showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale); REPORTER_ASSERT(reporter, 0); } else if (gShowPath || errors2x2 == MAX_ERRORS || errors2x2 == MAX_ERRORS - 1) { diff --git a/tests/PathOpsLineIntersectionTest.cpp b/tests/PathOpsLineIntersectionTest.cpp index 9885178603..379c2f16f9 100644 --- a/tests/PathOpsLineIntersectionTest.cpp +++ b/tests/PathOpsLineIntersectionTest.cpp @@ -50,7 +50,10 @@ static const SkDLine noIntersect[][2] = { static const size_t noIntersect_count = SK_ARRAY_COUNT(noIntersect); static const SkDLine coincidentTests[][2] = { - {{{{0,482.5}, {-4.4408921e-016,682.5}}}, + {{{ { 10105, 2510 }, { 10123, 2509.98999f } }}, + {{{10105, 2509.98999f}, { 10123, 2510 } }}}, + + {{ { { 0, 482.5 }, { -4.4408921e-016, 682.5 } } }, {{{0,683}, {0,482}}}}, {{{{1.77635684e-015,312}, {-1.24344979e-014,348}}}, @@ -76,9 +79,12 @@ static void check_results(skiatest::Reporter* reporter, const SkDLine& line1, co for (int i = 0; i < ts.used(); ++i) { SkDPoint result1 = line1.ptAtT(ts[0][i]); SkDPoint result2 = line2.ptAtT(ts[1][i]); - if (!result1.approximatelyEqual(result2)) { + if (!result1.approximatelyEqual(result2) && !ts.nearlySame(i)) { REPORTER_ASSERT(reporter, ts.used() != 1); result2 = line2.ptAtT(ts[1][i ^ 1]); + if (!result1.approximatelyEqual(result2)) { + SkDebugf("."); + } REPORTER_ASSERT(reporter, result1.approximatelyEqual(result2)); REPORTER_ASSERT(reporter, result1.approximatelyEqual(ts.pt(i).asSkPoint())); } diff --git a/tests/PathOpsOpTest.cpp b/tests/PathOpsOpTest.cpp index 75b6030aa5..5317792922 100644 --- a/tests/PathOpsOpTest.cpp +++ b/tests/PathOpsOpTest.cpp @@ -2065,6 +2065,11 @@ static void rectOp3x(skiatest::Reporter* reporter, const char* filename) { testPathOp(reporter, path, pathB, kXOR_PathOp, filename); } +#define ISSUE_1435_FIXED 0 +#if ISSUE_1435_FIXED +// this fails to generate two interior line segments +// an earlier pathops succeeded, but still failed to generate one interior line segment +// (but was saved by assemble, which works around a single line missing segment) static void issue1435(skiatest::Reporter* reporter, const char* filename) { SkPath path1; path1.moveTo(160, 60); @@ -2115,6 +2120,7 @@ static void issue1435(skiatest::Reporter* reporter, const char* filename) { path2.setFillType(SkPath::kEvenOdd_FillType); testPathOp(reporter, path1, path2, kIntersect_PathOp, filename); } +#endif static void skpkkiste_to716(skiatest::Reporter* reporter, const char* filename) { SkPath path; @@ -3348,10 +3354,116 @@ static void issue2504(skiatest::Reporter* reporter, const char* filename) { testPathOp(reporter, path1, path2, kUnion_PathOp, filename); } +#define TEST_2540 0 +#if TEST_2540 // FIXME: extends cubic arm for sorting, marks extension with wrong winding? +static void issue2540(skiatest::Reporter* reporter, const char* filename) { + SkPath path1; + path1.moveTo(26.5054988861083984375, 85.73960113525390625); + path1.cubicTo(84.19739532470703125, 17.77140045166015625, 16.93920135498046875, 101.86199951171875, 12.631000518798828125, 105.24700164794921875); + path1.cubicTo(11.0819997787475585937500000, 106.46399688720703125, 11.5260000228881835937500000, 104.464996337890625, 11.5260000228881835937500000, 104.464996337890625); + path1.lineTo(23.1654987335205078125, 89.72879791259765625); + path1.cubicTo(23.1654987335205078125, 89.72879791259765625, -10.1713008880615234375, 119.9160003662109375, -17.1620006561279296875, 120.8249969482421875); + path1.cubicTo(-19.1149997711181640625, 121.07900238037109375, -18.0380001068115234375, 119.79299163818359375, -18.0380001068115234375, 119.79299163818359375); + path1.cubicTo(-18.0380001068115234375, 119.79299163818359375, 14.22100067138671875, 90.60700225830078125, 26.5054988861083984375, 85.73960113525390625); + path1.close(); + + SkPath path2; + path2.moveTo(-25.077999114990234375, 124.9120025634765625); + path2.cubicTo(-25.077999114990234375, 124.9120025634765625, -25.9509983062744140625, 125.95400238037109375, -24.368999481201171875, 125.7480010986328125); + path2.cubicTo(-16.06999969482421875, 124.66899871826171875, 1.2680000066757202148437500, 91.23999786376953125, 37.264003753662109375, 95.35400390625); + path2.cubicTo(37.264003753662109375, 95.35400390625, 11.3710002899169921875, 83.7339935302734375, -25.077999114990234375, 124.9120025634765625); + path2.close(); + testPathOp(reporter, path1, path2, kUnion_PathOp, filename); +} +#endif + +static void rects1(skiatest::Reporter* reporter, const char* filename) { + SkPath path, pathB; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(0, 0); + path.lineTo(1, 0); + path.lineTo(1, 1); + path.lineTo(0, 1); + path.close(); + path.moveTo(0, 0); + path.lineTo(6, 0); + path.lineTo(6, 6); + path.lineTo(0, 6); + path.close(); + pathB.setFillType(SkPath::kEvenOdd_FillType); + pathB.moveTo(0, 0); + pathB.lineTo(1, 0); + pathB.lineTo(1, 1); + pathB.lineTo(0, 1); + pathB.close(); + pathB.moveTo(0, 0); + pathB.lineTo(2, 0); + pathB.lineTo(2, 2); + pathB.lineTo(0, 2); + pathB.close(); + testPathOp(reporter, path, pathB, kUnion_PathOp, filename); +} + +static void rects2(skiatest::Reporter* reporter, const char* filename) { + SkPath path, pathB; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(0, 0); + path.lineTo(4, 0); + path.lineTo(4, 4); + path.lineTo(0, 4); + path.close(); + path.moveTo(3, 3); + path.lineTo(4, 3); + path.lineTo(4, 4); + path.lineTo(3, 4); + path.close(); + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(3, 3); + pathB.lineTo(6, 3); + pathB.lineTo(6, 6); + pathB.lineTo(3, 6); + pathB.close(); + pathB.moveTo(3, 3); + pathB.lineTo(4, 3); + pathB.lineTo(4, 4); + pathB.lineTo(3, 4); + pathB.close(); + testPathOp(reporter, path, pathB, kDifference_PathOp, filename); +} + +static void rects3(skiatest::Reporter* reporter, const char* filename) { + SkPath path, pathB; + path.setFillType(SkPath::kEvenOdd_FillType); + path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); + path.addRect(0, 0, 4, 4, SkPath::kCW_Direction); + pathB.setFillType(SkPath::kWinding_FillType); + pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction); + pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction); + testPathOp(reporter, path, pathB, kDifference_PathOp, filename); +} + +static void rects4(skiatest::Reporter* reporter, const char* filename) { + SkPath path, pathB; + path.setFillType(SkPath::kEvenOdd_FillType); + path.addRect(0, 0, 1, 1, SkPath::kCW_Direction); + path.addRect(0, 0, 2, 2, SkPath::kCW_Direction); + pathB.setFillType(SkPath::kWinding_FillType); + pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction); + pathB.addRect(0, 0, 3, 3, SkPath::kCW_Direction); + testPathOp(reporter, path, pathB, kDifference_PathOp, filename); +} + static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0; static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0; static struct TestDesc tests[] = { + TEST(rects4), + TEST(rects3), + TEST(rects2), + TEST(rects1), +#if TEST_2540 // FIXME: extends cubic arm for sorting, marks extension with wrong winding? + TEST(issue2540), +#endif TEST(issue2504), TEST(kari1), TEST(quadOp10i), @@ -3390,7 +3502,9 @@ static struct TestDesc tests[] = { TEST(cubicOp101), TEST(cubicOp100), TEST(cubicOp99), +#if ISSUE_1435_FIXED TEST(issue1435), +#endif TEST(cubicOp98x), TEST(cubicOp97x), TEST(skpcarpetplanet_ru22), // cubic/cubic intersect detects unwanted coincidence diff --git a/tests/PathOpsSimplifyTest.cpp b/tests/PathOpsSimplifyTest.cpp index 7b5128cc2b..4bfab14488 100644 --- a/tests/PathOpsSimplifyTest.cpp +++ b/tests/PathOpsSimplifyTest.cpp @@ -4653,9 +4653,26 @@ static void testQuads61(skiatest::Reporter* reporter, const char* filename) { testSimplify(reporter, path, filename); } -static void (*firstTest)(skiatest::Reporter* , const char* filename) = testQuadratic56; +static void testQuadralateral10(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kWinding_FillType); + path.moveTo(0, 0); + path.lineTo(0, 0); + path.lineTo(0, 0); + path.lineTo(2, 2); + path.close(); + path.moveTo(1, 0); + path.lineTo(1, 1); + path.lineTo(2, 2); + path.lineTo(1, 3); + path.close(); + testSimplify(reporter, path, filename); +} + +static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0; static TestDesc tests[] = { + TEST(testQuadralateral10), TEST(testQuads61), TEST(testQuads60), TEST(testQuads59), diff --git a/tests/PathOpsSkpClipTest.cpp b/tests/PathOpsSkpClipTest.cpp index c0f028c55f..da505451da 100755 --- a/tests/PathOpsSkpClipTest.cpp +++ b/tests/PathOpsSkpClipTest.cpp @@ -27,87 +27,197 @@ #else #define PATH_SLASH "/" #define IN_DIR "/skp/2311328-7fc2228/slave" - #define OUT_DIR "/skpOut/2/" + #define OUT_DIR "/skpOut/4/" #endif const struct { int directory; const char* filename; } skipOverSept[] = { - { 9, "http___www_catingueiraonline_com_.skp"}, // infinite loop - {13, "http___www_galaxystwo_com_.skp"}, // infinite loop - {15, "http___www_giffingtool_com_.skp"}, // joinCoincidence / findT / assert - {15, "http___www_thaienews_blogspot_com_.skp"}, // infinite loop - {17, "http___www_gruposejaumdivulgador_com_br_.skp"}, // calcCoincidentWinding asserts zeroSpan + { 3, "http___www_americascup_com_.skp"}, // !simple->closed() {18, "http___www_argus_presse_fr_.skp"}, // can't find winding of remaining vertical edge - {21, "http___www_fashionscandal_com_.skp"}, // infinite loop - {21, "http___www_kenlevine_blogspot_com_.skp"}, // infinite loop - {25, "http___www_defense_studies_blogspot_com_.skp"}, // infinite loop - {27, "http___www_brokeroutpost_com_.skp"}, // suspect infinite loop - {28, "http___www_jaimebatistadasilva_blogspot_com_br_.skp"}, // suspect infinite loop - {28, "http___www_odia_com_br_.skp"}, // !simple->isClosed() - {29, "http___www_hubbyscook_com_.skp"}, // joinCoincidence / findT / assert - {30, "http___www_spankystokes_com_.skp"}, // suspect infinite loop - {32, "http___www_adalbertoday_blogspot_com_br_.skp"}, // suspect infinite loop - {32, "http___www_galery_annisa_com_.skp"}, // suspect infinite loop - {33, "http___www_pindosiya_com_.skp"}, // line quad intersection SkIntersections::assert - {36, "http___www_educationalcraft_com_.skp"}, // cubic / cubic near end / assert in SkIntersections::insert (missing skp test) - {36, "http___www_shaam_org_.skp"}, // suspect infinite loop - {36, "http___www_my_pillow_book_blogspot_gr_.skp"}, // suspect infinite loop - {39, "http___www_opbeat_com_.skp"}, // suspect infinite loop - {40, "http___www_phototransferapp_com_.skp"}, // !simple->isClosed() - {41, "http___www_freeismylife_com_.skp"}, // suspect infinite loop - {41, "http___www_accordidelmomento_com_.skp"}, // suspect infinite loop - {41, "http___www_evolvehq_com_.skp"}, // joinCoincidence / findT / assert - {44, "http___www_contextualnewsfeeds_com_.skp"}, // !simple->isClosed() + {31, "http___www_narayana_verlag_de_.skp"}, // !simple->closed() + {36, "http___www_educationalcraft_com_.skp"}, // cubic / cubic near end / assert in SkIntersections::insert {44, "http___www_cooksnaps_com_.skp"}, // !simple->isClosed() - {44, "http___www_helha_be_.skp"}, // !simple->isClosed() - {45, "http___www_blondesmakemoney_blogspot_com_.skp"}, // suspect infinite loop - {46, "http___www_cheaphealthygood_blogspot_com_.skp"}, // suspect infinite loop - {47, "http___www_ajitvadakayil_blogspot_in_.skp"}, // suspect infinite loop - {49, "http___www_karnivool_com_au_.skp"}, // SkOpAngle::setSector SkASSERT(fSectorStart >= 0); - {49, "http___www_tunero_de_.skp"}, // computeonesumreverse calls markwinding with 0 winding - {49, "http___www_thaienews_blogspot_sg_.skp"}, // suspect infinite loop - {50, "http___www_docgelo_com_.skp"}, // rightAngleWinding (probably same as argus_presse) + {48, "http___www_narayana_publishers_com_.skp"}, // !simple->isClosed() + {51, "http___www_freedominthe50states_org_.skp"}, // corrupt dash data + {52, "http___www_aceinfographics_com_.skp"}, // right angle winding assert {53, "http___www_lojaanabotafogo_com_br_.skp"}, // rrect validate assert - {54, "http___www_odecktestanswer2013_blogspot_in_.skp"}, // suspect infinite loop - {54, "http___www_cleristonsilva_com_br_.skp"}, // suspect infinite loop - {56, "http___www_simplysaru_com_.skp"}, // joinCoincidence / findT / assert - {57, "http___www_koukfamily_blogspot_gr_.skp"}, // suspect infinite loop - {57, "http___www_dinar2010_blogspot_com_.skp"}, // suspect infinite loop - {58, "http___www_artblart_com_.skp"}, // rightAngleWinding - {59, "http___www_accrispin_blogspot_com_.skp"}, // suspect infinite loop - {59, "http___www_vicisitudysordidez_blogspot_com_es_.skp"}, // suspect infinite loop - {60, "http___www_thehousingbubbleblog_com_.skp"}, // suspect infinite loop - {61, "http___www_jessicaslens_wordpress_com_.skp"}, // joinCoincidence / findT / assert - {61, "http___www_partsdata_de_.skp"}, // cubic-cubic intersection reduce checkLinear assert - {62, "http___www_blondesmakemoney_blogspot_com_au_.skp"}, // suspect infinite loop - {62, "http___www_intellibriefs_blogspot_in_.skp"}, // suspect infinite loop - {63, "http___www_tankerenemy_com_.skp"}, // suspect infinite loop - {65, "http___www_kpopexplorer_net_.skp"}, // joinCoincidence / findT / assert - {65, "http___www_bestthingsinbeauty_blogspot_com_.skp"}, // suspect infinite loop - {65, "http___www_wartepop_blogspot_com_br_.skp"}, // !simple->isClosed() - {65, "http___www_eolake_blogspot_com_.skp"}, // suspect infinite loop - {67, "http___www_cacadordemisterio_blogspot_com_br_.skp"}, // suspect infinite loop - {69, "http___www_misnotasyapuntes_blogspot_mx_.skp"}, // suspect infinite loop - {69, "http___www_awalkintheparknyc_blogspot_com_.skp"}, // suspect infinite loop - {71, "http___www_lokado_de_.skp"}, // joinCoincidence / findT / assert - {72, "http___www_karlosdesanjuan_blogspot_com_.skp"}, // suspect infinite loop - {73, "http___www_cyberlawsinindia_blogspot_in_.skp"}, // suspect infinite loop - {73, "http___www_taxiemmovimento_blogspot_com_br_.skp"}, // suspect infinite loop - {74, "http___www_giveusliberty1776_blogspot_com_.skp"}, // suspect infinite loop - {75, "http___www_e_cynical_blogspot_gr_.skp"}, // suspect infinite loop - {76, "http___www_seopack_blogspot_com_.skp"}, // SkOpAngle::setSector SkASSERT(fSectorStart >= 0); - {77, "http___www_sunsky_russia_com_.skp"}, // joinCoincidence / findT / assert (no op test, already fixed hopefully) - {78, "http___www_bisnisonlineinfo_com_.skp"}, // suspect infinite loop - {79, "http___www_danielsgroupcpa_com_.skp"}, // joinCoincidence / findT / assert (no op test, already fixed hopefully) - {80, "http___www_clinique_portugal_com_.skp"}, // suspect infinite loop - {81, "http___www_europebusines_blogspot_com_.skp"}, // suspect infinite loop - {82, "http___www_apopsignomi_blogspot_gr_.skp"}, // suspect infinite loop - {85, "http___www_ajitvadakayil_blogspot_com_.skp"}, // suspect infinite loop - {86, "http___www_madhousefamilyreviews_blogspot_co_uk_.skp"}, // suspect infinite loop + {57, "http___www_vantageproduction_com_.skp"}, // !isClosed() + {64, "http___www_etiqadd_com_.skp"}, // !simple->closed() + {84, "http___www_swapspacesystems_com_.skp"}, // !simple->closed() + {90, "http___www_tcmevents_org_.skp"}, // !simple->closed() + {96, "http___www_paseoitaigara_com_br_.skp"}, // !simple->closed() + {98, "http___www_mortgagemarketguide_com_.skp"}, // !simple->closed() + {99, "http___www_kitcheninspirations_wordpress_com_.skp"}, // checkSmall / bumpSpan }; +/* stats +97 http___www_brandyandvinca_com_.skp pixelError=3 +95 http___www_into_asia_com_.skp pixelError=12 +93 http___www_lunarplanner_com_.skp pixelError=14 +98 http___www_lovelyitalia_com_.skp pixelError=17 +90 http___www_inter_partner_blogspot_com_.skp pixelError=18 +99 http___www_maxarea_com_.skp pixelError=26 +98 http___www_maroonsnet_org_.skp pixelError=33 +92 http___www_belinaart_ru_.skp pixelError=50 +100 http___www_chroot_ro_.skp pixelError=62 +99 http___www_hsbrands_com_.skp pixelError=98 +95 http___www_tournamentindicator_com_.skp pixelError=122 +93 http___www_businesses_com_au_.skp pixelError=162 +90 http___www_regenesys_net_.skp pixelError=182 +88 http___www_1863544208148625103_c18eac63985503fa85b06358959c1ba27fc36f82_blogspot_com_.skp pixelError=186 +97 http___www_pregacoesevangelica_com_br_.skp pixelError=240 +77 http___www_zhenggang_org_.skp pixelError=284 +96 http___slidesharemailer_com_.skp pixelError=522 +94 http___www_gensteel_com_.skp pixelError=555 +68 http___www_jf_eti_br_.skp pixelError=610 +83 http___www_swishiat_com_.skp pixelError=706 +96 http___www_matusikmissive_com_au_.skp pixelError=2580 +95 http___www_momentumnation_com_.skp pixelError=3938 +92 http___www_rssowl_com_.skp pixelError=5113 +96 http___www_sexxygirl_tv_.skp pixelError=7605 +99 http___www_georgevalah_wordpress_com_.skp pixelError=8386 +78 http___www_furbo_org_.skp pixelError=8656 +78 http___www_djxhemary_wordpress_com_.skp pixelError=8976 +100 http___www_mindcontrolblackassassins_com_.skp pixelError=31950 +98 http___bababillgates_free_fr_.skp pixelError=40237 +98 http___hepatite_ro_.skp pixelError=44370 +86 http___www_somethingwagging_com_.skp pixelError=47794 +84 http___www_beverageuniverse_com_.skp pixelError=65450 +50 http___www_aveksa_com_.skp pixelError=68194 +10 http___www_publiker_pl_.skp pixelError=89997 +61 http___www_dominos_co_id_.skp pixelError=476868 +87 http___www_du_edu_om_.skp time=46 +87 http___www_bigload_de_.skp time=46 +100 http___www_home_forum_com_.skp time=48 +97 http___www_hotamateurchat_com_.skp time=48 +97 http___www_myrsky_com_cn_.skp time=48 +98 http___www_techiegeex_com_.skp time=49 +82 http___www_fashionoutletsofchicago_com_.skp time=50 +77 http___www_dynamischbureau_nl_.skp time=50 +82 http___www_mayihelpu_co_in_.skp time=50 +84 http___www_vbox7_com_user_history_viewers_.skp time=50 +85 http___www_ktokogda_com_.skp time=50 +85 http___www_propertyturkeysale_com_.skp time=50 +85 http___www_51play_com_.skp time=50 +86 http___www_bayalarm_com_.skp time=50 +87 http___www_eaglepictures_com_.skp time=50 +88 http___www_atlasakvaryum_com_.skp time=50 +91 http___www_pioneerchryslerjeep_com_.skp time=50 +94 http___www_thepulsemag_com_.skp time=50 +95 http___www_dcshoes_com_ph_.skp time=50 +96 http___www_montrealmassage_ca_.skp time=50 +96 http___www_jkshahclasses_com_.skp time=50 +96 http___www_webcamconsult_com_.skp time=51 +100 http___www_bsoscblog_com_.skp time=52 +95 http___www_flaktwoods_com_.skp time=53 +91 http___www_qivivo_com_.skp time=54 +90 http___www_unitender_com_.skp time=56 +97 http___www_casinogaming_com_.skp time=56 +97 http___www_rootdownload_com_.skp time=56 +94 http___www_aspa_ev_de_.skp time=57 +98 http___www_tenpieknyswiat_pl_.skp time=57 +93 http___www_transocean_de_.skp time=58 +94 http___www_vdo2_blogspot_com_.skp time=58 +94 http___www_asmaissexy_com_br_.skp time=58 +100 http___www_prefeiturasjm_com_br_.skp time=60 +100 http___www_eduinsuranceclick_blogspot_com_.skp time=60 +96 http___www_bobdunsire_com_.skp time=61 +96 http___www_omgkettlecorn_com_.skp time=61 +85 http___www_fbbsessions_com_.skp time=62 +86 http___www_hector_ru_.skp time=62 +87 http___www_wereldsupporter_nl_.skp time=62 +90 http___www_arello_com_.skp time=62 +93 http___www_bayerplastics_com_.skp time=62 +93 http___www_superandolamovida_com_ar_.skp time=62 +96 http___www_med_rbf_ru_.skp time=62 +81 http___www_carnegiescience_edu_.skp time=65 +87 http___www_asanewengland_com_.skp time=65 +92 http___www_turkce_karakter_appspot_com_.skp time=65 +94 http___www_k3a_org_.skp time=65 +96 http___www_powermaccenter_com_.skp time=65 +98 http___www_avto49_ru_.skp time=67 +100 http___www_hetoldeambaecht_nl_.skp time=68 +95 http___www_marine_ie_.skp time=69 +96 http___www_quebecvapeboutique_com_.skp time=69 +95 http___www_brays_ingles_com_.skp time=70 +100 http___www_lacondesa_com_.skp time=72 +95 http___www_timbarrathai_com_au_.skp time=76 +95 http___www_cuissedegrenouille_com_.skp time=76 +95 http___www_iwama51_ru_.skp time=76 +99 http___www_fotoantologia_it_.skp time=76 +92 http___www_indian_architects_com_.skp time=78 +92 http___www_totalwomanspa_com_.skp time=78 +100 http___www_fachverband_spielhallen_de_.skp time=83 +93 http___www_golshanemehr_ir_.skp time=84 +95 http___www_maryesses_com_.skp time=84 +99 http___www_ddcorp_ca_.skp time=89 +90 http___www_brontops_com_.skp time=89 +94 http___www_robgolding_com_.skp time=89 +91 http___www_tecban_com_br_.skp time=91 +98 http___www_costamesakarate_com_.skp time=100 +95 http___www_monsexyblog_com_.skp time=103 +97 http___www_stornowaygazette_co_uk_.skp time=103 +93 http___www_fitforaframe_com_.skp time=104 +98 http___www_intentionoftheday_com_.skp time=113 +100 http___www_tailgateclothing_com_.skp time=117 +95 http___www_senbros_com_.skp time=118 +93 http___www_lettoblog_com_.skp time=121 +94 http___www_maxineschallenge_com_au_.skp time=125 +95 http___www_savvycard_net_.skp time=127 +95 http___www_open_ac_mu_.skp time=129 +96 http___www_avgindia_in_.skp time=135 +97 http___www_stocktonseaview_com_.skp time=135 +96 http___www_distroller_com_.skp time=142 +94 http___www_travoggalop_dk_.skp time=144 +100 http___www_history_im_.skp time=144 +94 http___www_playradio_sk_.skp time=145 +92 http___www_linglongglass_com_.skp time=151 +97 http___www_bizzna_com_.skp time=151 +96 http___www_spiros_ws_.skp time=154 +91 http___www_rosen_meents_co_il_.skp time=156 +81 http___www_hoteldeluxeportland_com_.skp time=158 +92 http___www_freetennis_org_.skp time=161 +93 http___www_aircharternetwork_com_au_.skp time=161 +94 http___www_austinparks_org_.skp time=165 +89 http___www_bevvy_co_.skp time=168 +91 http___www_sosyalhile_net_.skp time=168 +98 http___www_minvih_gob_ve_.skp time=171 +89 http___www_streetfoodmtl_com_.skp time=172 +92 http___www_loveslatinas_tumblr_com_.skp time=178 +93 http___www_madbites_co_in_.skp time=180 +94 http___www_rocktarah_ir_.skp time=185 +97 http___www_penthouselife_com_.skp time=185 +96 http___www_appymonkey_com_.skp time=196 +92 http___www_pasargadhotels_com_.skp time=203 +99 http___www_marina_mil_pe_.skp time=203 +89 http___www_kays_co_uk_.skp time=205 +77 http___www_334588_com_.skp time=211 +83 http___www_trendbad24_de_.skp time=211 +81 http___www_cdnetworks_co_kr_.skp time=216 +94 http___www_schellgames_com_.skp time=223 +95 http___www_juliaweddingnews_cn_.skp time=230 +92 http___www_xcrafters_pl_.skp time=253 +93 http___www_pondoo_com_.skp time=253 +96 http___www_helsinkicapitalpartners_fi_.skp time=255 +88 http___www_nadtexican_com_.skp time=259 +85 http___www_canstockphoto_hu_.skp time=266 +78 http___www_ecovacs_com_cn_.skp time=271 +93 http___www_brookfieldplaceny_com_.skp time=334 +93 http___www_fmastrengthtraining_com_.skp time=337 +94 http___www_turtleonthebeach_com_.skp time=394 +90 http___www_temptationthemovie_com_.skp time=413 +95 http___www_patongsawaddi_com_.skp time=491 +91 http___www_online_radio_appspot_com_.skp time=511 +68 http___www_richardmiller_co_uk_.skp time=528 +63 http___www_eschrade_com_.skp time=543 +55 http___www_interaction_inf_br_.skp time=625 +38 http___www_huskyliners_com_.skp time=632 +86 http___granda_net_.skp time=1067 +24 http___www_cocacolafm_com_br_.skp time=1081 +*/ + size_t skipOverSeptCount = sizeof(skipOverSept) / sizeof(skipOverSept[0]); enum TestStep { @@ -116,7 +226,7 @@ enum TestStep { }; enum { - kMaxLength = 128, + kMaxLength = 256, kMaxFiles = 128, kSmallLimit = 1000, }; @@ -190,6 +300,13 @@ public: } }; +class SortByName : public TestResult { +public: + bool operator<(const SortByName& rh) const { + return strcmp(fFilename, rh.fFilename) < 0; + } +}; + struct TestState { void init(int dirNo, skiatest::Reporter* reporter) { fReporter = reporter; @@ -217,11 +334,6 @@ struct TestRunner { class TestRunnable : public SkRunnable { public: - TestRunnable(void (*testFun)(TestState*), int dirNo, TestRunner* runner) { - fState.init(dirNo, runner->fReporter); - fTestFun = testFun; - } - virtual void run() SK_OVERRIDE { SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024); (*fTestFun)(&fState); @@ -231,6 +343,33 @@ public: void (*fTestFun)(TestState*); }; + +class TestRunnableDir : public TestRunnable { +public: + TestRunnableDir(void (*testFun)(TestState*), int dirNo, TestRunner* runner) { + fState.init(dirNo, runner->fReporter); + fTestFun = testFun; + } + +}; + +class TestRunnableFile : public TestRunnable { +public: + TestRunnableFile(void (*testFun)(TestState*), int dirNo, const char* name, TestRunner* runner) { + fState.init(dirNo, runner->fReporter); + strcpy(fState.fResult.fFilename, name); + fTestFun = testFun; + } +}; + +class TestRunnableEncode : public TestRunnableFile { +public: + TestRunnableEncode(void (*testFun)(TestState*), int dirNo, const char* name, TestRunner* runner) + : TestRunnableFile(testFun, dirNo, name, runner) { + fState.fResult.fTestStep = kEncodeFiles; + } +}; + TestRunner::~TestRunner() { for (int index = 0; index < fRunnables.count(); index++) { SkDELETE(fRunnables[index]); @@ -272,6 +411,16 @@ static SkString make_in_dir_name(int dirNo) { return dirName; } +static SkString make_stat_dir_name(int dirNo) { + SkString dirName(outStatusDir); + dirName.appendf("%d", dirNo); + if (!sk_exists(dirName.c_str())) { + SkDebugf("could not read dir %s\n", dirName.c_str()); + return SkString(); + } + return dirName; +} + static bool make_one_out_dir(const char* outDirStr) { SkString outDir = make_filepath(0, outDirStr, ""); if (!sk_exists(outDir.c_str())) { @@ -675,32 +824,79 @@ static bool initTest() { return make_out_dirs(); } +static bool initUberTest(int firstDirNo, int lastDirNo) { + if (!initTest()) { + return false; + } + for (int index = firstDirNo; index <= lastDirNo; ++index) { + SkString statusDir(outStatusDir); + statusDir.appendf("%d", index); + if (!make_one_out_dir(statusDir.c_str())) { + return false; + } + } + return true; +} + + +static void testSkpClipEncode(TestState* data) { + data->fResult.testOne(); + if (data->fReporter->verbose()) { + SkDebugf("+"); + } +} + static void encodeFound(skiatest::Reporter* reporter, TestState& state) { if (reporter->verbose()) { - SkTDArray<SortByPixel*> worst; - for (int index = 0; index < state.fPixelWorst.count(); ++index) { - *worst.append() = &state.fPixelWorst[index]; - } - SkTQSort<SortByPixel>(worst.begin(), worst.end() - 1); - for (int index = 0; index < state.fPixelWorst.count(); ++index) { - const TestResult& result = *worst[index]; - SkDebugf("%d %s pixelError=%d\n", result.fDirNo, result.fFilename, result.fPixelError); + if (state.fPixelWorst.count()) { + SkTDArray<SortByPixel*> worst; + for (int index = 0; index < state.fPixelWorst.count(); ++index) { + *worst.append() = &state.fPixelWorst[index]; + } + SkTQSort<SortByPixel>(worst.begin(), worst.end() - 1); + for (int index = 0; index < state.fPixelWorst.count(); ++index) { + const TestResult& result = *worst[index]; + SkDebugf("%d %s pixelError=%d\n", result.fDirNo, result.fFilename, result.fPixelError); + } } - SkTDArray<SortByTime*> slowest; - for (int index = 0; index < state.fSlowest.count(); ++index) { - *slowest.append() = &state.fSlowest[index]; + if (state.fSlowest.count()) { + SkTDArray<SortByTime*> slowest; + for (int index = 0; index < state.fSlowest.count(); ++index) { + *slowest.append() = &state.fSlowest[index]; + } + if (slowest.count() > 0) { + SkTQSort<SortByTime>(slowest.begin(), slowest.end() - 1); + for (int index = 0; index < slowest.count(); ++index) { + const TestResult& result = *slowest[index]; + SkDebugf("%d %s time=%d\n", result.fDirNo, result.fFilename, result.fTime); + } + } } - SkTQSort<SortByTime>(slowest.begin(), slowest.end() - 1); - for (int index = 0; index < slowest.count(); ++index) { - const TestResult& result = *slowest[index]; - SkDebugf("%d %s time=%d\n", result.fDirNo, result.fFilename, result.fTime); + } + + int threadCount = reporter->allowThreaded() ? SkThreadPool::kThreadPerCore : 1; + TestRunner testRunner(reporter, threadCount); + for (int index = 0; index < state.fPixelWorst.count(); ++index) { + const TestResult& result = state.fPixelWorst[index]; + SkString filename(result.fFilename); + if (!filename.endsWith(".skp")) { + filename.append(".skp"); } + *testRunner.fRunnables.append() = SkNEW_ARGS(TestRunnableEncode, + (&testSkpClipEncode, result.fDirNo, filename.c_str(), &testRunner)); } + testRunner.render(); +#if 0 for (int index = 0; index < state.fPixelWorst.count(); ++index) { const TestResult& result = state.fPixelWorst[index]; - TestResult::Test(result.fDirNo, result.fFilename, kEncodeFiles); - if (state.fReporter->verbose()) SkDebugf("+"); + SkString filename(result.fFilename); + if (!filename.endsWith(".skp")) { + filename.append(".skp"); + } + TestResult::Test(result.fDirNo, filename.c_str(), kEncodeFiles); + if (reporter->verbose()) SkDebugf("+"); } +#endif } DEF_TEST(PathOpsSkpClip, reporter) { @@ -732,19 +928,177 @@ DEF_TEST(PathOpsSkpClipThreaded, reporter) { } int threadCount = reporter->allowThreaded() ? SkThreadPool::kThreadPerCore : 1; TestRunner testRunner(reporter, threadCount); - for (int dirNo = 1; dirNo <= 100; ++dirNo) { - *testRunner.fRunnables.append() = SkNEW_ARGS(TestRunnable, + const int firstDirNo = 1; + for (int dirNo = firstDirNo; dirNo <= 100; ++dirNo) { + *testRunner.fRunnables.append() = SkNEW_ARGS(TestRunnableDir, (&testSkpClipMain, dirNo, &testRunner)); } testRunner.render(); TestState state; state.init(0, reporter); - for (int dirNo = 1; dirNo <= 100; ++dirNo) { + for (int dirNo = firstDirNo; dirNo <= 100; ++dirNo) { TestState& testState = testRunner.fRunnables[dirNo - 1]->fState; + SkASSERT(testState.fResult.fDirNo == dirNo); for (int inner = 0; inner < testState.fPixelWorst.count(); ++inner) { - SkASSERT(testState.fResult.fDirNo == dirNo); addError(&state, testState.fPixelWorst[inner]); } + for (int inner = 0; inner < testState.fSlowest.count(); ++inner) { + addError(&state, testState.fSlowest[inner]); + } + } + encodeFound(reporter, state); +} + +static void testSkpClipUber(TestState* data) { + data->fResult.testOne(); + SkString dirName = make_stat_dir_name(data->fResult.fDirNo); + if (!dirName.size()) { + return; + } + SkString statName(data->fResult.fFilename); + SkASSERT(statName.endsWith(".skp")); + statName.remove(statName.size() - 4, 4); + statName.appendf(".%d.%d.skp", data->fResult.fPixelError, data->fResult.fTime); + SkString statusFile = make_filepath(data->fResult.fDirNo, outStatusDir, statName.c_str()); + SkFILE* file = sk_fopen(statusFile.c_str(), kWrite_SkFILE_Flag); + if (!file) { + SkDebugf("failed to create %s", statusFile.c_str()); + return; + } + sk_fclose(file); + if (data->fReporter->verbose()) { + if (data->fResult.fPixelError || data->fResult.fTime) { + SkDebugf("%s", data->fResult.progress().c_str()); + } else { + SkDebugf("."); + } + } +} + +static bool buildTests(skiatest::Reporter* reporter, int firstDirNo, int lastDirNo, SkTDArray<TestResult>* tests, + SkTDArray<SortByName*>* sorted) { + for (int dirNo = firstDirNo; dirNo <= lastDirNo; ++dirNo) { + SkString dirName = make_stat_dir_name(dirNo); + if (!dirName.size()) { + return false; + } + SkOSFile::Iter iter(dirName.c_str(), "skp"); + SkString filename; + while (iter.next(&filename)) { + TestResult test; + test.init(dirNo); + SkString spaceFile(filename); + char* spaces = spaceFile.writable_str(); + int spaceSize = (int) spaceFile.size(); + for (int index = 0; index < spaceSize; ++index) { + if (spaces[index] == '.') { + spaces[index] = ' '; + } + } + int success = sscanf(spaces, "%s %d %d skp", test.fFilename, + &test.fPixelError, &test.fTime); + if (success < 3) { + SkDebugf("failed to scan %s matched=%d\n", filename.c_str(), success); + return false; + } + *tests[dirNo - firstDirNo].append() = test; + } + if (!sorted) { + continue; + } + SkTDArray<TestResult>& testSet = tests[dirNo - firstDirNo]; + int count = testSet.count(); + for (int index = 0; index < count; ++index) { + *sorted[dirNo - firstDirNo].append() = (SortByName*) &testSet[index]; + } + if (sorted[dirNo - firstDirNo].count()) { + SkTQSort<SortByName>(sorted[dirNo - firstDirNo].begin(), + sorted[dirNo - firstDirNo].end() - 1); + if (reporter->verbose()) { + SkDebugf("+"); + } + } + } + return true; +} + +bool Less(const SortByName& a, const SortByName& b); +bool Less(const SortByName& a, const SortByName& b) { + return a < b; +} + +DEF_TEST(PathOpsSkpClipUberThreaded, reporter) { + const int firstDirNo = 1; + const int lastDirNo = 100; + if (!initUberTest(firstDirNo, lastDirNo)) { + return; + } + const int dirCount = lastDirNo - firstDirNo + 1; + SkTDArray<TestResult> tests[dirCount]; + SkTDArray<SortByName*> sorted[dirCount]; + if (!buildTests(reporter, firstDirNo, lastDirNo, tests, sorted)) { + return; + } + int threadCount = reporter->allowThreaded() ? SkThreadPool::kThreadPerCore : 1; + TestRunner testRunner(reporter, threadCount); + for (int dirNo = firstDirNo; dirNo <= lastDirNo; ++dirNo) { + SkString dirName = make_in_dir_name(dirNo); + if (!dirName.size()) { + continue; + } + SkOSFile::Iter iter(dirName.c_str(), "skp"); + SkString filename; + while (iter.next(&filename)) { + int count; + SortByName name; + for (size_t index = 0; index < skipOverSeptCount; ++index) { + if (skipOverSept[index].directory == dirNo + && strcmp(filename.c_str(), skipOverSept[index].filename) == 0) { + goto checkEarlyExit; + } + } + name.init(dirNo); + strncpy(name.fFilename, filename.c_str(), filename.size() - 4); // drop .skp + count = sorted[dirNo - firstDirNo].count(); + if (SkTSearch<SortByName, Less>(sorted[dirNo - firstDirNo].begin(), + count, &name, sizeof(&name)) < 0) { + *testRunner.fRunnables.append() = SkNEW_ARGS(TestRunnableFile, + (&testSkpClipUber, dirNo, filename.c_str(), &testRunner)); + } + checkEarlyExit: + ; + } + + } + testRunner.render(); + SkTDArray<TestResult> results[dirCount]; + if (!buildTests(reporter, firstDirNo, lastDirNo, results, NULL)) { + return; + } + SkTDArray<TestResult> allResults; + for (int dirNo = firstDirNo; dirNo <= lastDirNo; ++dirNo) { + SkTDArray<TestResult>& array = results[dirNo - firstDirNo]; + allResults.append(array.count(), array.begin()); + } + int allCount = allResults.count(); + SkTDArray<SortByPixel*> pixels; + SkTDArray<SortByTime*> times; + for (int index = 0; index < allCount; ++index) { + *pixels.append() = (SortByPixel*) &allResults[index]; + *times.append() = (SortByTime*) &allResults[index]; + } + TestState state; + if (pixels.count()) { + SkTQSort<SortByPixel>(pixels.begin(), pixels.end() - 1); + for (int inner = 0; inner < kMaxFiles; ++inner) { + *state.fPixelWorst.append() = *pixels[allCount - inner - 1]; + } + } + if (times.count()) { + SkTQSort<SortByTime>(times.begin(), times.end() - 1); + for (int inner = 0; inner < kMaxFiles; ++inner) { + *state.fSlowest.append() = *times[allCount - inner - 1]; + } } encodeFound(reporter, state); } diff --git a/tests/PathOpsSkpTest.cpp b/tests/PathOpsSkpTest.cpp index 5b10a1f736..3cfe4e2f7a 100755 --- a/tests/PathOpsSkpTest.cpp +++ b/tests/PathOpsSkpTest.cpp @@ -9,7 +9,6 @@ #define TEST(name) { name, #name } #define TRY_NEW_TESTS 0 -#define TRY_NEW_TESTS_IS_CLOSED 0 static void skpcheeseandburger_com225(skiatest::Reporter* reporter, const char* filename) { SkPath path; @@ -1809,15 +1808,6 @@ static void skpwww_heartiste_wordpress_com_86(skiatest::Reporter* reporter, cons testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -/* - * 125 SkASSERT(index < fCount); -(gdb) bt -#0 0x000000000041094b in SkTDArray<SkOpSpan>::operator[] (this=0x18, index=2) at ../../include/core/SkTDArray.h:125 -#1 0x00000000005ad2ce in SkOpSegment::tAtMid (this=0x0, start=2, end=5, mid=0.90000000000000002) at ../../src/pathops/SkOpSegment.h:219 -#2 0x00000000005aadea in contourRangeCheckY (contourList=..., currentPtr=0x7fffd77f4ec0, indexPtr=0x7fffd77f4f88, endIndexPtr=0x7fffd77f4f8c, bestHit=0x7fffd77f4ec8, - bestDx=0x7fffd77f4edc, tryAgain=0x7fffd77f4eff, midPtr=0x7fffd77f4e60, opp=false) at ../../src/pathops/SkPathOpsCommon.cpp:20 -#3 0x00000000005ab8ee in rightAngleWinding (contourList=..., current=0x7fffd77f4ec0, index=0x7fffd77f4f88, endIndex=0x7fffd77f4f8c, tHit=0x7fffd77f4ec8, hitDx=0x7fffd77f4edc, - */ #if TRY_NEW_TESTS static void skpwww_argus_presse_fr_41(skiatest::Reporter* reporter, const char* filename) { SkPath path; @@ -1988,8 +1978,6 @@ static void skpwww_hubbyscook_com_22(skiatest::Reporter* reporter, const char* f testPathOp(reporter, path, pathB, kDifference_PathOp, filename); } -// calcCoincidentWinding asserts in zeroSpan -#if TRY_NEW_TESTS static void skpwww_gruposejaumdivulgador_com_br_4(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2008,10 +1996,8 @@ static void skpwww_gruposejaumdivulgador_com_br_4(skiatest::Reporter* reporter, pathB.close(); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif // asserts in bridgeOp simple->isClosed() -#if TRY_NEW_TESTS_IS_CLOSED static void skpwww_phototransferapp_com_24(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2036,10 +2022,32 @@ static void skpwww_phototransferapp_com_24(skiatest::Reporter* reporter, const c pathB.close(); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif -// !simple->isClosed() -#if TRY_NEW_TESTS_IS_CLOSED +static void skpwww_phototransferapp_com_24x(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(85.6091843f, 5.92893219f); + path.quadTo(89.6041641f, 3, 93.7462997f, 3); + path.lineTo(112.74634f, 3); + path.quadTo(116.88843f, 3, 118.75134f, 5.92893219f); + path.quadTo(120.61414f, 8.85775471f, 119.10669f, 12.9996767f); + path.quadTo(120.46338f, 9.27196693f, 118.4939f, 6.63603878f); + path.quadTo(116.52441f, 4, 112.38232f, 4); + path.lineTo(93.3823318f, 4); + path.quadTo(89.2401962f, 4, 85.3518219f, 6.63603878f); + path.quadTo(81.4634476f, 9.27207756f, 80.1065979f, 13); + path.quadTo(81.614212f, 8.85786438f, 85.6091843f, 5.92893219f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(83.7462997f, 3); + pathB.lineTo(122.74634f, 3); + pathB.lineTo(119.10657f, 13); + pathB.lineTo(80.1065979f, 13); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + static void skpwww_helha_be_109(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2061,9 +2069,7 @@ static void skpwww_helha_be_109(skiatest::Reporter* reporter, const char* filena pathB.lineTo(104.291214f, 3359.87891f); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif -// !simple->isClosed() static void skpwww_cooksnaps_com_32(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2116,6 +2122,22 @@ static void skpwww_cooksnaps_com_32(skiatest::Reporter* reporter, const char* fi testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } +static void skpwww_cooksnaps_com_32a(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(497.299988f, 176.896912f); + path.quadTo(493.678162f, 177.952286f, 490.183014f, 179.9702f); + path.lineTo(489.316986f, 180.4702f); + path.quadTo(485.175385f, 182.861359f, 482.115265f, 186.082397f); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(474.873322f, 199.293594f); + pathB.quadTo(478.196686f, 186.890503f, 489.316986f, 180.4702f); + pathB.lineTo(490.183014f, 179.9702f); + pathB.quadTo(501.303345f, 173.549896f, 513.706421f, 176.873276f); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + // !simple->isClosed() static void skpwww_contextualnewsfeeds_com_346(skiatest::Reporter* reporter, const char* filename) { SkPath path; @@ -2182,8 +2204,6 @@ static void skpwww_karnivool_com_au_11(skiatest::Reporter* reporter, const char* testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -// computeonesumreverse calls markwinding with 0 winding -#if TRY_NEW_TESTS static void skpwww_tunero_de_24(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2222,10 +2242,7 @@ static void skpwww_tunero_de_24(skiatest::Reporter* reporter, const char* filena pathB.close(); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif -// rightAngleWinding (probably same as argus_presse) -#if TRY_NEW_TESTS static void skpwww_docgelo_com_66(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2243,9 +2260,7 @@ static void skpwww_docgelo_com_66(skiatest::Reporter* reporter, const char* file pathB.lineTo(185.5f, 24174.75f); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif -// joinCoincidence / findT / assert static void skpwww_kpopexplorer_net_22(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2274,8 +2289,6 @@ static void skpwww_kpopexplorer_net_22(skiatest::Reporter* reporter, const char* testPathOp(reporter, path, pathB, kDifference_PathOp, filename); } -// rightAngleWinding -#if TRY_NEW_TESTS static void skpwww_artblart_com_8(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2293,7 +2306,6 @@ static void skpwww_artblart_com_8(skiatest::Reporter* reporter, const char* file pathB.lineTo(45, 24527.5f); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif // joinCoincidence / findT / assert static void skpwww_jessicaslens_wordpress_com_222(skiatest::Reporter* reporter, const char* filename) { @@ -2746,6 +2758,38 @@ static void skpwww_wartepop_blogspot_com_br_6(skiatest::Reporter* reporter, cons testPathOp(reporter, path, pathB, kDifference_PathOp, filename); } +static void skpwww_wartepop_blogspot_com_br_6a(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(90.9763107f, 153.309662f); + path.quadTo(91.9526215f, 152.333344f, 93.3333359f, 152.333344f); + path.lineTo(124.666672f, 152.333344f); + path.quadTo(126.047379f, 152.333344f, 127.023689f, 153.309662f); + path.quadTo(128, 154.285965f, 128, 155.666672f); + path.lineTo(128, 163.666672f); + path.lineTo(90, 163.666672f); + path.lineTo(90, 155.666672f); + path.quadTo(90, 154.285965f, 90.9763107f, 153.309662f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(90, 163.666672f); + pathB.lineTo(90, 155.666672f); + pathB.quadTo(90, 154.285965f, 90.9763107f, 153.309662f); + pathB.quadTo(91.9526215f, 152.333344f, 93.3333359f, 152.333344f); + pathB.lineTo(124.666672f, 152.333344f); + pathB.quadTo(125.909309f, 152.333344f, 126.787994f, 153.309662f); + pathB.quadTo(127.666672f, 154.285965f, 127.666672f, 155.666672f); + pathB.lineTo(127.666672f, 163.666672f); + pathB.lineTo(127.666672f, 163.666672f); + pathB.lineTo(127.666672f, 163.666672f); + pathB.lineTo(90, 163.666672f); + pathB.lineTo(90, 163.666672f); + pathB.lineTo(90, 163.666672f); + pathB.close(); + testPathOp(reporter, path, pathB, kDifference_PathOp, filename); +} + // !simple->isClosed() static void skpwww_odia_com_br_26(skiatest::Reporter* reporter, const char* filename) { SkPath path; @@ -2868,8 +2912,6 @@ static void skpwww_galaxystwo_com_4(skiatest::Reporter* reporter, const char* fi testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -// hangs in find top -#if TRY_NEW_TESTS static void skpwww_thaienews_blogspot_com_36(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2887,9 +2929,7 @@ static void skpwww_thaienews_blogspot_com_36(skiatest::Reporter* reporter, const pathB.lineTo(430.5f, 6268); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif -// hangs static void skpwww_fashionscandal_com_94(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2962,8 +3002,6 @@ static void skpwww_defense_studies_blogspot_com_64(skiatest::Reporter* reporter, testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -// checkSmall / addTPair / addT assert -#if TRY_NEW_TESTS static void skpwww_uniquefx_net_442(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -2981,10 +3019,7 @@ static void skpwww_uniquefx_net_442(skiatest::Reporter* reporter, const char* fi pathB.lineTo(1019, 305); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif -// rightAngleWinding -#if TRY_NEW_TESTS static void skpwww_kitcheninspirations_wordpress_com_32(skiatest::Reporter* reporter, const char* filename) { SkPath path; path.setFillType(SkPath::kEvenOdd_FillType); @@ -3002,58 +3037,570 @@ static void skpwww_kitcheninspirations_wordpress_com_32(skiatest::Reporter* repo pathB.lineTo(65.8333359f, 19651.5f); testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); } -#endif + +static void skpwww_educationalcraft_com_4(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(941, 1494); + path.lineTo(941, 1464); + path.lineTo(985, 1464); + path.lineTo(985, 1494); + path.lineTo(941, 1494); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(979.211975f, 1480.45496f); + pathB.cubicTo(979.211975f, 1480.45496f, 976.348999f, 1479.68506f, 977.495972f, 1475.59497f); + pathB.cubicTo(977.497009f, 1475.59497f, 981.072021f, 1477.88501f, 979.211975f, 1480.45496f); + pathB.close(); + pathB.moveTo(977.854004f, 1484.453f); + pathB.cubicTo(977.854004f, 1484.453f, 975.265991f, 1483.26099f, 976.713989f, 1479.35205f); + pathB.cubicTo(976.713989f, 1479.35303f, 979.84198f, 1482.23499f, 977.854004f, 1484.453f); + pathB.close(); + pathB.moveTo(980.226013f, 1476.229f); + pathB.cubicTo(980.226013f, 1476.229f, 977.078003f, 1476.349f, 977.234985f, 1471.97095f); + pathB.cubicTo(977.234985f, 1471.97095f, 980.666992f, 1473.12903f, 980.226013f, 1476.229f); + pathB.close(); + pathB.moveTo(984.546021f, 1478.31494f); + pathB.cubicTo(984.546021f, 1478.31494f, 983.187988f, 1481.93396f, 980.026001f, 1481.276f); + pathB.cubicTo(980.026978f, 1481.276f, 979.554993f, 1478.38904f, 984.546021f, 1478.31494f); + pathB.close(); + pathB.moveTo(978.989014f, 1484.198f); + pathB.cubicTo(978.989014f, 1484.198f, 979.094971f, 1481.33496f, 983.786011f, 1481.823f); + pathB.cubicTo(983.786011f, 1481.823f, 982.070007f, 1485.49805f, 978.989014f, 1484.198f); + pathB.close(); + pathB.moveTo(976.393005f, 1486.86804f); + pathB.cubicTo(976.393005f, 1486.86804f, 976.719971f, 1484.06494f, 981.679016f, 1485.37f); + pathB.cubicTo(981.679016f, 1485.37f, 979.169983f, 1488.40796f, 976.393005f, 1486.86804f); + pathB.close(); + pathB.moveTo(969.156982f, 1490.40002f); + pathB.cubicTo(969.156982f, 1490.40002f, 971.478027f, 1488.23596f, 974.869995f, 1491.21399f); + pathB.cubicTo(974.869995f, 1491.21497f, 970.828003f, 1493.026f, 969.156982f, 1490.40002f); + pathB.close(); + pathB.moveTo(972.825012f, 1483.93701f); + pathB.cubicTo(972.825012f, 1483.93701f, 973.971985f, 1487.98401f, 971.161987f, 1488.94604f); + pathB.cubicTo(971.161987f, 1488.94495f, 969.278015f, 1486.37097f, 972.825012f, 1483.93701f); + pathB.close(); + pathB.moveTo(965.60199f, 1489.98499f); + pathB.cubicTo(965.60199f, 1489.98499f, 964.879028f, 1487.19202f, 969.864014f, 1486.75f); + pathB.cubicTo(969.864014f, 1486.75f, 968.749023f, 1490.672f, 965.60199f, 1489.98499f); + pathB.close(); + pathB.moveTo(970.666992f, 1492.81604f); + pathB.cubicTo(970.666992f, 1492.81604f, 967.327026f, 1494.49695f, 964.999023f, 1491.56299f); + pathB.cubicTo(964.999023f, 1491.56299f, 967.304016f, 1489.43896f, 970.666992f, 1492.81604f); + pathB.close(); + pathB.moveTo(968.343994f, 1481.53796f); + pathB.cubicTo(971.573975f, 1479.94995f, 971.687988f, 1476.78601f, 971.687988f, 1476.78601f); + pathB.lineTo(971.393982f, 1466.83398f); + pathB.lineTo(954.960999f, 1466.83398f); + pathB.lineTo(954.666016f, 1476.78601f); + pathB.cubicTo(954.666016f, 1476.78601f, 954.780029f, 1479.94995f, 958.008972f, 1481.53796f); + pathB.cubicTo(960.781006f, 1482.90295f, 962.166992f, 1484.77698f, 962.166992f, 1484.77698f); + pathB.cubicTo(962.166992f, 1484.77698f, 962.747986f, 1485.70105f, 963.177979f, 1485.70105f); + pathB.cubicTo(963.606995f, 1485.70105f, 964.185974f, 1484.77698f, 964.185974f, 1484.77698f); + pathB.cubicTo(964.185974f, 1484.77698f, 965.573975f, 1482.90295f, 968.343994f, 1481.53796f); + pathB.close(); + pathB.moveTo(963.215027f, 1486.67004f); + pathB.cubicTo(962.744995f, 1486.67004f, 962.106995f, 1485.65405f, 962.106995f, 1485.65405f); + pathB.cubicTo(962.106995f, 1485.65405f, 960.585022f, 1483.59595f, 957.539001f, 1482.09705f); + pathB.cubicTo(953.991028f, 1480.35205f, 953.867004f, 1476.87598f, 953.867004f, 1476.87598f); + pathB.lineTo(954.190002f, 1465.94397f); + pathB.lineTo(972.23999f, 1465.94397f); + pathB.lineTo(972.565002f, 1476.87695f); + pathB.cubicTo(972.565002f, 1476.87695f, 972.440979f, 1480.35303f, 968.891968f, 1482.09802f); + pathB.cubicTo(965.846008f, 1483.59705f, 964.325012f, 1485.65503f, 964.325012f, 1485.65503f); + pathB.cubicTo(964.325012f, 1485.65503f, 963.687012f, 1486.67004f, 963.215027f, 1486.67004f); + pathB.close(); + pathB.moveTo(960.68103f, 1489.98499f); + pathB.cubicTo(957.533997f, 1490.672f, 956.417969f, 1486.75f, 956.417969f, 1486.75f); + pathB.cubicTo(961.403015f, 1487.19202f, 960.68103f, 1489.98499f, 960.68103f, 1489.98499f); + pathB.close(); + pathB.moveTo(963.143005f, 1489.59802f); + pathB.cubicTo(963.763f, 1489.59802f, 964.265015f, 1490.09998f, 964.265015f, 1490.72095f); + pathB.cubicTo(964.265015f, 1491.34204f, 963.763f, 1491.84399f, 963.143005f, 1491.84399f); + pathB.cubicTo(962.521973f, 1491.84399f, 962.02002f, 1491.34204f, 962.02002f, 1490.72095f); + pathB.cubicTo(962.02002f, 1490.09998f, 962.521973f, 1489.59802f, 963.143005f, 1489.59802f); + pathB.close(); + pathB.moveTo(961.283997f, 1491.56299f); + pathB.cubicTo(958.953979f, 1494.49695f, 955.61499f, 1492.81604f, 955.61499f, 1492.81604f); + pathB.cubicTo(958.97699f, 1489.43896f, 961.283997f, 1491.56299f, 961.283997f, 1491.56299f); + pathB.close(); + pathB.moveTo(957.127014f, 1490.40002f); + pathB.cubicTo(955.455017f, 1493.026f, 951.414001f, 1491.21399f, 951.414001f, 1491.21399f); + pathB.cubicTo(954.802979f, 1488.23596f, 957.127014f, 1490.40002f, 957.127014f, 1490.40002f); + pathB.close(); + pathB.moveTo(949.890991f, 1486.86804f); + pathB.cubicTo(947.112976f, 1488.40796f, 944.604004f, 1485.37f, 944.604004f, 1485.37f); + pathB.cubicTo(949.562012f, 1484.06494f, 949.890991f, 1486.86804f, 949.890991f, 1486.86804f); + pathB.close(); + pathB.moveTo(947.070984f, 1480.45496f); + pathB.cubicTo(945.211975f, 1477.88501f, 948.786011f, 1475.59497f, 948.786011f, 1475.59497f); + pathB.cubicTo(949.934021f, 1479.68506f, 947.070984f, 1480.45496f, 947.070984f, 1480.45496f); + pathB.close(); + pathB.moveTo(946.054016f, 1476.229f); + pathB.cubicTo(945.61499f, 1473.12903f, 949.046997f, 1471.97095f, 949.046997f, 1471.97095f); + pathB.cubicTo(949.205994f, 1476.349f, 946.054016f, 1476.229f, 946.054016f, 1476.229f); + pathB.close(); + pathB.moveTo(948.427002f, 1484.453f); + pathB.cubicTo(946.440002f, 1482.23499f, 949.567993f, 1479.35205f, 949.567993f, 1479.35205f); + pathB.cubicTo(951.015991f, 1483.26099f, 948.427002f, 1484.453f, 948.427002f, 1484.453f); + pathB.close(); + pathB.moveTo(947.294006f, 1484.198f); + pathB.cubicTo(944.210999f, 1485.49805f, 942.495972f, 1481.823f, 942.495972f, 1481.823f); + pathB.cubicTo(947.187988f, 1481.33496f, 947.294006f, 1484.198f, 947.294006f, 1484.198f); + pathB.close(); + pathB.moveTo(946.255005f, 1481.276f); + pathB.cubicTo(943.094971f, 1481.93396f, 941.736023f, 1478.31494f, 941.736023f, 1478.31494f); + pathB.cubicTo(946.728027f, 1478.38904f, 946.255005f, 1481.276f, 946.255005f, 1481.276f); + pathB.close(); + pathB.moveTo(945.312988f, 1478.18005f); + pathB.cubicTo(942.052979f, 1477.80103f, 942.651001f, 1473.87805f, 942.651001f, 1473.87805f); + pathB.cubicTo(946.562988f, 1475.66199f, 945.312988f, 1478.18005f, 945.312988f, 1478.18005f); + pathB.close(); + pathB.moveTo(945.382019f, 1474.328f); + pathB.cubicTo(942.924011f, 1472.729f, 944.492004f, 1469.48706f, 944.492004f, 1469.48706f); + pathB.cubicTo(947.388977f, 1471.95703f, 945.382019f, 1474.328f, 945.382019f, 1474.328f); + pathB.close(); + pathB.moveTo(946.797974f, 1470.27405f); + pathB.cubicTo(944.664978f, 1467.90198f, 947.083984f, 1465.50598f, 947.083984f, 1465.50598f); + pathB.cubicTo(949.145996f, 1468.82605f, 946.797974f, 1470.27405f, 946.797974f, 1470.27405f); + pathB.close(); + pathB.moveTo(947.392029f, 1471.64197f); + pathB.cubicTo(947.624023f, 1468.56299f, 951.361023f, 1468.29199f, 951.361023f, 1468.29199f); + pathB.cubicTo(950.554016f, 1471.98499f, 947.392029f, 1471.64197f, 947.392029f, 1471.64197f); + pathB.close(); + pathB.moveTo(948.64801f, 1468.15002f); + pathB.cubicTo(948.638977f, 1465.22095f, 952.265991f, 1464.46399f, 952.265991f, 1464.46399f); + pathB.cubicTo(951.672974f, 1468.53101f, 948.64801f, 1468.15002f, 948.64801f, 1468.15002f); + pathB.close(); + pathB.moveTo(951.176025f, 1486.97803f); + pathB.cubicTo(948.963013f, 1484.62f, 951.361023f, 1481.77698f, 951.361023f, 1481.77698f); + pathB.cubicTo(953.734985f, 1485.48596f, 951.176025f, 1486.97803f, 951.176025f, 1486.97803f); + pathB.close(); + pathB.moveTo(947.51001f, 1488.53101f); + pathB.cubicTo(947.51001f, 1488.53101f, 951.596985f, 1486.32202f, 953.234009f, 1489.08997f); + pathB.cubicTo(953.234009f, 1489.08997f, 951.158997f, 1491.03601f, 947.51001f, 1488.53101f); + pathB.close(); + pathB.moveTo(955.120972f, 1488.94495f); + pathB.cubicTo(952.309021f, 1487.98303f, 953.458984f, 1483.93604f, 953.458984f, 1483.93604f); + pathB.cubicTo(957.004028f, 1486.37097f, 955.120972f, 1488.94495f, 955.120972f, 1488.94495f); + pathB.close(); + pathB.moveTo(978.770996f, 1488.53101f); + pathB.cubicTo(975.122986f, 1491.03601f, 973.047974f, 1489.08997f, 973.047974f, 1489.08997f); + pathB.cubicTo(974.684998f, 1486.32202f, 978.770996f, 1488.53101f, 978.770996f, 1488.53101f); + pathB.close(); + pathB.moveTo(975.106995f, 1486.97803f); + pathB.cubicTo(975.106995f, 1486.97803f, 972.546997f, 1485.48706f, 974.919983f, 1481.77698f); + pathB.cubicTo(974.919983f, 1481.776f, 977.31897f, 1484.61902f, 975.106995f, 1486.97803f); + pathB.close(); + pathB.moveTo(974.016968f, 1464.46399f); + pathB.cubicTo(974.016968f, 1464.46399f, 977.643982f, 1465.22095f, 977.633972f, 1468.15002f); + pathB.cubicTo(977.633972f, 1468.15002f, 974.611023f, 1468.53101f, 974.016968f, 1464.46399f); + pathB.close(); + pathB.moveTo(974.919983f, 1468.29199f); + pathB.cubicTo(974.919983f, 1468.29199f, 978.658997f, 1468.56299f, 978.890015f, 1471.64197f); + pathB.cubicTo(978.890015f, 1471.64197f, 975.72699f, 1471.98499f, 974.919983f, 1468.29199f); + pathB.close(); + pathB.moveTo(979.197998f, 1465.50598f); + pathB.cubicTo(979.197998f, 1465.50598f, 981.619019f, 1467.90198f, 979.481995f, 1470.27405f); + pathB.cubicTo(979.481995f, 1470.27405f, 977.138f, 1468.82605f, 979.197998f, 1465.50598f); + pathB.close(); + pathB.moveTo(980.900024f, 1474.328f); + pathB.cubicTo(980.900024f, 1474.328f, 978.893005f, 1471.95703f, 981.791016f, 1469.48706f); + pathB.cubicTo(981.791016f, 1469.48596f, 983.358032f, 1472.729f, 980.900024f, 1474.328f); + pathB.close(); + pathB.moveTo(980.968994f, 1478.18005f); + pathB.cubicTo(980.968994f, 1478.18005f, 979.718018f, 1475.66199f, 983.632019f, 1473.87805f); + pathB.cubicTo(983.632019f, 1473.87805f, 984.229004f, 1477.80103f, 980.968994f, 1478.18005f); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_narayana_publishers_com_194(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(1083.34314f, 445.65686f); + path.quadTo(1081, 443.313721f, 1081, 440); + path.lineTo(1257, 440); + path.quadTo(1257, 443.313721f, 1254.65686f, 445.65686f); + path.quadTo(1252.31372f, 448, 1249, 448); + path.lineTo(1089, 448); + path.quadTo(1085.68628f, 448, 1083.34314f, 445.65686f); + path.close(); + path.moveTo(1083, 441); + path.lineTo(1255, 441); + path.quadTo(1255, 443.071075f, 1253.53552f, 444.535522f); + path.quadTo(1252.07104f, 446, 1250, 446); + path.lineTo(1088, 446); + path.quadTo(1085.92896f, 446, 1084.46448f, 444.535522f); + path.quadTo(1083, 443.071075f, 1083, 441); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(1081, 440); + pathB.lineTo(1082, 440); + pathB.lineTo(1090.01001f, 448); + pathB.lineTo(1081, 448); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_cooksnaps_com_17(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(170.340179f, 176); + path.lineTo(166, 176); + path.quadTo(161.964188f, 176, 158.299957f, 176.896912f); + path.quadTo(154.678162f, 177.952271f, 151.183014f, 179.9702f); + path.lineTo(150.316986f, 180.4702f); + path.quadTo(146.175812f, 182.861099f, 143.115921f, 186.081696f); + path.quadTo(140.693939f, 188.70134f, 138.99472f, 191.620407f); + path.quadTo(137.316833f, 194.550888f, 136.259338f, 197.957367f); + path.quadTo(135, 202.217865f, 135, 207); + path.lineTo(135, 208); + path.quadTo(135, 212.035751f, 135.896912f, 215.699997f); + path.quadTo(136.952286f, 219.321869f, 138.9702f, 222.816986f); + path.lineTo(139.4702f, 223.683014f); + path.quadTo(141.861099f, 227.824188f, 145.081696f, 230.884079f); + path.quadTo(147.70134f, 233.306061f, 150.620407f, 235.00528f); + path.quadTo(153.550888f, 236.683167f, 156.957367f, 237.740662f); + path.quadTo(161.217865f, 239, 166, 239); + path.lineTo(170.482162f, 239); + path.quadTo(176.307037f, 238.210968f, 181.816986f, 235.0298f); + path.lineTo(182.683014f, 234.5298f); + path.quadTo(182.686462f, 234.527817f, 182.689896f, 234.525818f); + path.quadTo(193.804352f, 228.105652f, 197.126709f, 215.70639f); + path.quadTo(200.450104f, 203.303314f, 194.0298f, 192.183014f); + path.lineTo(193.5298f, 191.316986f); + path.quadTo(187.109497f, 180.196686f, 174.706406f, 176.873276f); + path.quadTo(172.503067f, 176.282898f, 170.340179f, 176); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(139.4702f, 223.683014f); + pathB.lineTo(138.9702f, 222.816986f); + pathB.quadTo(132.549896f, 211.696686f, 135.873291f, 199.293594f); + pathB.quadTo(139.196686f, 186.890503f, 150.316986f, 180.4702f); + pathB.lineTo(151.183014f, 179.9702f); + pathB.quadTo(162.303314f, 173.549896f, 174.706406f, 176.873276f); + pathB.quadTo(187.109497f, 180.196686f, 193.5298f, 191.316986f); + pathB.lineTo(194.0298f, 192.183014f); + pathB.quadTo(200.450104f, 203.303314f, 197.126709f, 215.70639f); + pathB.quadTo(193.803314f, 228.109497f, 182.683014f, 234.5298f); + pathB.lineTo(181.816986f, 235.0298f); + pathB.quadTo(170.696686f, 241.450104f, 158.293594f, 238.126709f); + pathB.quadTo(145.890503f, 234.803314f, 139.4702f, 223.683014f); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_swapspacesystems_com_5(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(819.050781f, 5539.72412f); + path.quadTo(819.651672f, 5539.1543f, 820.479858f, 5539.17578f); + path.lineTo(1191.35278f, 5548.8877f); + path.quadTo(1192.18091f, 5548.90918f, 1192.7511f, 5549.50977f); + path.quadTo(1193.32141f, 5550.11133f, 1193.29968f, 5550.93945f); + path.lineTo(1186.57214f, 5807.85107f); + path.quadTo(1186.55054f, 5808.6792f, 1185.94958f, 5809.24951f); + path.quadTo(1185.34863f, 5809.81982f, 1184.52051f, 5809.79834f); + path.lineTo(813.647705f, 5800.08643f); + path.quadTo(812.819519f, 5800.06494f, 812.249268f, 5799.46387f); + path.quadTo(811.679016f, 5798.86279f, 811.700684f, 5798.03467f); + path.lineTo(818.428162f, 5541.12305f); + path.quadTo(818.44989f, 5540.29492f, 819.050781f, 5539.72412f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(818.48053f, 5539.12354f); + pathB.lineTo(1193.35205f, 5548.93994f); + pathB.lineTo(1186.5199f, 5809.85059f); + pathB.lineTo(811.648376f, 5800.03418f); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_kitcheninspirations_wordpress_com_66(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(47.1666679f, 27820.668f); + path.lineTo(60.8333359f, 27820.668f); + path.lineTo(60.8333359f, 27820.498f); + path.lineTo(47.1666679f, 27820.5f); + path.lineTo(47.1666679f, 27820.668f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(47.1666679f, 27820.668f); + pathB.lineTo(47.1666679f, 27820.498f); + pathB.lineTo(60.8333359f, 27820.5f); + pathB.lineTo(60.8333359f, 27820.668f); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_etiqadd_com_2464(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(630.378662f, 1293.42896f); + path.quadTo(631.257385f, 1292.55029f, 632.5f, 1292.55029f); + path.quadTo(633.742615f, 1292.55029f, 634.621338f, 1293.42896f); + path.lineTo(639.571045f, 1298.37866f); + path.quadTo(640.449768f, 1299.25732f, 640.449707f, 1300.5f); + path.quadTo(640.449768f, 1301.74268f, 639.571045f, 1302.62134f); + path.lineTo(634.621338f, 1307.57104f); + path.quadTo(633.742615f, 1308.44971f, 632.5f, 1308.44971f); + path.quadTo(631.257385f, 1308.44971f, 630.378662f, 1307.57104f); + path.lineTo(625.428955f, 1302.62134f); + path.quadTo(624.550232f, 1301.74268f, 624.550293f, 1300.5f); + path.quadTo(624.550232f, 1299.25732f, 625.428955f, 1298.37866f); + path.lineTo(630.378662f, 1293.42896f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(632.5f, 1291.30762f); + pathB.lineTo(641.692383f, 1300.5f); + pathB.lineTo(632.5f, 1309.69238f); + pathB.lineTo(623.307617f, 1300.5f); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_narayana_verlag_de_194(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(1083.34314f, 513.65686f); + path.quadTo(1081, 511.313721f, 1081, 508); + path.lineTo(1257, 508); + path.quadTo(1257, 511.313721f, 1254.65686f, 513.65686f); + path.quadTo(1252.31372f, 516, 1249, 516); + path.lineTo(1089, 516); + path.quadTo(1085.68628f, 516, 1083.34314f, 513.65686f); + path.close(); + path.moveTo(1083, 509); + path.lineTo(1255, 509); + path.quadTo(1255, 511.071075f, 1253.53552f, 512.535522f); + path.quadTo(1252.07104f, 514, 1250, 514); + path.lineTo(1088, 514); + path.quadTo(1085.92896f, 514, 1084.46448f, 512.535522f); + path.quadTo(1083, 511.071075f, 1083, 509); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(1081, 508); + pathB.lineTo(1082, 508); + pathB.lineTo(1090.01001f, 516); + pathB.lineTo(1081, 516); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_americascup_com_108(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(999.454102f, 689.17157f); + path.quadTo(1001.172f, 688, 1002.82886f, 688); + path.lineTo(1013.82886f, 688); + path.lineTo(1002.17114f, 713); + path.lineTo(991.171143f, 713); + path.quadTo(989.514282f, 713, 988.889038f, 711.82843f); + path.quadTo(988.263794f, 710.65686f, 989.036377f, 709); + path.lineTo(996.963623f, 692); + path.quadTo(997.736206f, 690.34314f, 999.454102f, 689.17157f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(998.828857f, 688); + pathB.lineTo(1013.82886f, 688); + pathB.lineTo(1002.17114f, 713); + pathB.lineTo(987.171143f, 713); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_vantageproduction_com_109(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(794.514709f, 759.485291f); + path.quadTo(791, 755.970581f, 791, 751); + path.lineTo(1133, 751); + path.quadTo(1133, 755.970581f, 1129.48523f, 759.485291f); + path.quadTo(1125.97058f, 763, 1121, 763); + path.lineTo(803, 763); + path.quadTo(798.029419f, 763, 794.514709f, 759.485291f); + path.close(); + path.moveTo(793, 752); + path.lineTo(1131, 752); + path.quadTo(1131, 755.727905f, 1128.36401f, 758.363953f); + path.quadTo(1125.72791f, 761, 1122, 761); + path.lineTo(802, 761); + path.quadTo(798.272095f, 761, 795.636047f, 758.363953f); + path.quadTo(793, 755.727905f, 793, 752); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(791, 751); + pathB.lineTo(792, 751); + pathB.lineTo(804.01001f, 763); + pathB.lineTo(791, 763); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_aceinfographics_com_106(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(166.878677f, 7638.87891f); + path.quadTo(166, 7639.75732f, 166, 7641); + path.lineTo(166, 11577); + path.quadTo(166, 11578.2422f, 166.878677f, 11579.1211f); + path.quadTo(167.388f, 11579.6309f, 168.019989f, 11579.8447f); + path.lineTo(168.019974f, 11576.2979f); + path.quadTo(168, 11576.1533f, 168, 11576); + path.lineTo(168, 7642); + path.lineTo(168.000015f, 7641.99316f); + path.lineTo(168, 7640); + path.lineTo(166.878677f, 7638.87891f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(166, 7638); + pathB.lineTo(168.020004f, 7635.97998f); + pathB.lineTo(168, 11578); + pathB.lineTo(166, 11580); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_tcmevents_org_13(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(465.951904f, 547.960144f); + path.quadTo(465.66571f, 546.867371f, 465.404938f, 546); + path.lineTo(465.504089f, 546); + path.quadTo(465.670349f, 546.601257f, 465.84668f, 547.288391f); + path.quadTo(467.274506f, 552.852356f, 468.506836f, 560.718567f); + path.quadTo(467.336121f, 553.24585f, 465.951904f, 547.960144f); + path.close(); + path.moveTo(470.591064f, 574.024353f); + path.quadTo(474.844055f, 601.176025f, 471.728271f, 620.364502f); + path.quadTo(470.567017f, 627.515991f, 468.635742f, 632); + path.lineTo(469.106812f, 632); + path.quadTo(470.791504f, 627.638672f, 471.833496f, 621.036255f); + path.quadTo(474.905701f, 601.569519f, 470.591064f, 574.024353f); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(322.992462f, 541.475708f); + pathB.lineTo(465.531616f, 541.724426f); + pathB.lineTo(468.507751f, 560.724426f); + pathB.lineTo(325.968597f, 560.475708f); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_paseoitaigara_com_br_56(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(633.147217f, 1247); + path.lineTo(718, 1162.14722f); + path.lineTo(802.852783f, 1247); + path.lineTo(718, 1331.85278f); + path.lineTo(633.147217f, 1247); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(635.268494f, 1244.87866f); + pathB.lineTo(715.878662f, 1164.26855f); + pathB.quadTo(716.757385f, 1163.38989f, 718, 1163.38989f); + pathB.quadTo(719.242615f, 1163.38989f, 720.121338f, 1164.26855f); + pathB.lineTo(800.731506f, 1244.87866f); + pathB.quadTo(801.610168f, 1245.75732f, 801.610168f, 1247); + pathB.quadTo(801.610229f, 1248.24268f, 800.731445f, 1249.12134f); + pathB.lineTo(720.121338f, 1329.73145f); + pathB.quadTo(719.242676f, 1330.61011f, 718, 1330.61011f); + pathB.quadTo(716.757385f, 1330.61011f, 715.878723f, 1329.73145f); + pathB.lineTo(635.268555f, 1249.12134f); + pathB.quadTo(634.389832f, 1248.24268f, 634.389832f, 1247); + pathB.quadTo(634.389832f, 1245.75732f, 635.268494f, 1244.87866f); + pathB.close(); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} + +static void skpwww_mortgagemarketguide_com_109(skiatest::Reporter* reporter, const char* filename) { + SkPath path; + path.setFillType(SkPath::kEvenOdd_FillType); + path.moveTo(816.514709f, 781.485291f); + path.quadTo(813, 777.970581f, 813, 773); + path.lineTo(1133, 773); + path.quadTo(1133, 777.970581f, 1129.48523f, 781.485291f); + path.quadTo(1125.97058f, 785, 1121, 785); + path.lineTo(825, 785); + path.quadTo(820.029419f, 785, 816.514709f, 781.485291f); + path.close(); + path.moveTo(815, 774); + path.lineTo(1131, 774); + path.quadTo(1131, 777.727905f, 1128.36401f, 780.363953f); + path.quadTo(1125.72791f, 783, 1122, 783); + path.lineTo(824, 783); + path.quadTo(820.272095f, 783, 817.636047f, 780.363953f); + path.quadTo(815, 777.727905f, 815, 774); + path.close(); + SkPath pathB; + pathB.setFillType(SkPath::kWinding_FillType); + pathB.moveTo(813, 773); + pathB.lineTo(814, 773); + pathB.lineTo(826.01001f, 785); + pathB.lineTo(813, 785); + testPathOp(reporter, path, pathB, kIntersect_PathOp, filename); +} static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0; static struct TestDesc tests[] = { + TEST(skpwww_wartepop_blogspot_com_br_6), + TEST(skpwww_wartepop_blogspot_com_br_6a), + TEST(skpwww_cooksnaps_com_32a), #if TRY_NEW_TESTS - TEST(skpwww_kitcheninspirations_wordpress_com_32), // rightanglewinding -#endif -#if TRY_NEW_TESTS - TEST(skpwww_uniquefx_net_442), // checkSmall / addTPair / addT assert + TEST(skpwww_argus_presse_fr_41), #endif + TEST(skpwww_cooksnaps_com_17), + TEST(skpwww_cooksnaps_com_32), + TEST(skpwww_kitcheninspirations_wordpress_com_66), + TEST(skpwww_tcmevents_org_13), + TEST(skpwww_narayana_publishers_com_194), + TEST(skpwww_swapspacesystems_com_5), + TEST(skpwww_vantageproduction_com_109), + TEST(skpwww_americascup_com_108), + TEST(skpwww_narayana_verlag_de_194), + TEST(skpwww_etiqadd_com_2464), + TEST(skpwww_paseoitaigara_com_br_56), + TEST(skpwww_mortgagemarketguide_com_109), + TEST(skpwww_aceinfographics_com_106), + TEST(skpwww_educationalcraft_com_4), + TEST(skpwww_kitcheninspirations_wordpress_com_32), + TEST(skpwww_artblart_com_8), + TEST(skpwww_docgelo_com_66), + TEST(skpwww_uniquefx_net_442), TEST(skpwww_defense_studies_blogspot_com_64), TEST(skpwww_kenlevine_blogspot_com_28), TEST(skpwww_fashionscandal_com_94), -#if TRY_NEW_TESTS - TEST(skpwww_thaienews_blogspot_com_36), // completes but fails to produce correct output -#endif + TEST(skpwww_thaienews_blogspot_com_36), TEST(skpwww_galaxystwo_com_4), TEST(skpwww_catingueiraonline_com_352), TEST(skpwww_evolvehq_com_210), - TEST(skpwww_odia_com_br_26), // asserts expecting isClosed - TEST(skpwww_wartepop_blogspot_com_br_6), // asserts expecting isClosed + TEST(skpwww_odia_com_br_26), TEST(skpwww_lokado_de_173), TEST(skpwww_seopack_blogspot_com_2153), TEST(skpwww_partsdata_de_53), TEST(skpwww_simplysaru_com_40), TEST(skpwww_jessicaslens_wordpress_com_222), -#if TRY_NEW_TESTS - TEST(skpwww_artblart_com_8), // rightanglewinding -#endif TEST(skpwww_kpopexplorer_net_22), -#if TRY_NEW_TESTS - TEST(skpwww_docgelo_com_66), // rightanglewinding -#endif -#if TRY_NEW_TESTS // nearly coincident curves -- maybe angle is written before coincidence detected? - TEST(skpwww_tunero_de_24), // has both winding and oppWinding set to zero in markWinding -#endif + TEST(skpwww_tunero_de_24), TEST(skpwww_karnivool_com_au_11), TEST(skpwww_pindosiya_com_99), - TEST(skpwww_contextualnewsfeeds_com_346), // asserts expecting isClosed - TEST(skpwww_cooksnaps_com_32), // asserts expecting isClosed -#if TRY_NEW_TESTS_IS_CLOSED - TEST(skpwww_helha_be_109), // asserts expecting isClosed - TEST(skpwww_phototransferapp_com_24), // asserts expecting isClosed -#endif -#if TRY_NEW_TESTS - TEST(skpwww_gruposejaumdivulgador_com_br_4), // span already marked done is futher marked coin -#endif + TEST(skpwww_contextualnewsfeeds_com_346), + TEST(skpwww_helha_be_109), + TEST(skpwww_phototransferapp_com_24), + TEST(skpwww_phototransferapp_com_24x), + TEST(skpwww_gruposejaumdivulgador_com_br_4), TEST(skpwww_hubbyscook_com_22), -#if TRY_NEW_TESTS - TEST(skpwww_argus_presse_fr_41), // rightanglewinding -#endif TEST(skpwww_maturesupertube_com_21), TEST(skpwww_getgold_jp_731), TEST(skpwww_trashness_com_36), @@ -3072,17 +3619,17 @@ static struct TestDesc tests[] = { TEST(skpskpicture15), TEST(skpwww_meb_gov_tr_6), TEST(skpwww_sciality_com_101), - TEST(skpwww_booking_com_68), // similar to lavoixdunord - TEST(skpwww_despegar_com_mx_272), // similar to lavoixdunord - TEST(skpwww_lavoixdunord_fr_11), // not quite coincident, sorting line/cubic fails - TEST(skppptv_com_62), // cubic have nearly identical tangents, sort incorrectly + TEST(skpwww_booking_com_68), + TEST(skpwww_despegar_com_mx_272), + TEST(skpwww_lavoixdunord_fr_11), + TEST(skppptv_com_62), TEST(skppchappy_com_au102), TEST(skpsciality_com161), TEST(skpi_gino_com16), - TEST(skpnaoxrane_ru23), // see test for failure evaluation - TEST(skptcmevents_org23), // see test for (partial) failure evaluation - TEST(skpredbullskatearcade_es16), // cubic have nearly identical tangents, sort incorrectly - TEST(skpfinanzasdigital_com9), // cubic/quad tangents too close to sort + TEST(skpnaoxrane_ru23), + TEST(skptcmevents_org23), + TEST(skpredbullskatearcade_es16), + TEST(skpfinanzasdigital_com9), TEST(skpgithub_io_26), TEST(skpgithub_io_25), TEST(skpwww_meb_gov_tr_5), |