aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorGravatar caryclark <caryclark@google.com>2014-06-17 05:15:38 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-06-17 05:15:38 -0700
commitdac1d17027dcaa5596885a9f333979418b35001c (patch)
tree923c6ca762654144254565240de5e9ec6598c41f /tests
parentd6043b20b63f895d384b4794205ac914abfafa71 (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-xtests/PathOpsAngleIdeas.cpp6
-rw-r--r--tests/PathOpsAngleTest.cpp8
-rw-r--r--tests/PathOpsCubicIntersectionTest.cpp3
-rwxr-xr-xtests/PathOpsDebug.cpp304
-rw-r--r--tests/PathOpsExtendedTest.cpp11
-rw-r--r--tests/PathOpsLineIntersectionTest.cpp10
-rw-r--r--tests/PathOpsOpTest.cpp114
-rw-r--r--tests/PathOpsSimplifyTest.cpp19
-rwxr-xr-xtests/PathOpsSkpClipTest.cpp548
-rwxr-xr-xtests/PathOpsSkpTest.cpp701
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),