| Index: tests/PathOpsExtendedTest.cpp
|
| diff --git a/tests/PathOpsExtendedTest.cpp b/tests/PathOpsExtendedTest.cpp
|
| index cee27e458899ed296c9fb375ccfc53d5bbd8146b..97897f234420e7a37ece2f7c839de8ea2600f30e 100644
|
| --- a/tests/PathOpsExtendedTest.cpp
|
| +++ b/tests/PathOpsExtendedTest.cpp
|
| @@ -14,6 +14,7 @@
|
| #include "SkPaint.h"
|
| #include "SkRTConf.h"
|
| #include "SkStream.h"
|
| +#include "SkThread.h"
|
| #include "SkThreadPool.h"
|
|
|
| #ifdef SK_BUILD_FOR_MAC
|
| @@ -61,7 +62,7 @@ static void output_scalar(SkScalar num) {
|
| } else {
|
| SkString str;
|
| str.printf("%1.9g", num);
|
| - int width = str.size();
|
| + int width = (int) str.size();
|
| const char* cStr = str.c_str();
|
| while (cStr[width - 1] == '0') {
|
| --width;
|
| @@ -149,7 +150,7 @@ static void showPathData(const SkPath& path) {
|
| SkPath::RawIter iter(path);
|
| uint8_t verb;
|
| SkPoint pts[4];
|
| - SkPoint firstPt, lastPt;
|
| + SkPoint firstPt = {0, 0}, lastPt = {0, 0};
|
| bool firstPtSet = false;
|
| bool lastPtSet = true;
|
| while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
|
| @@ -217,7 +218,7 @@ void showOp(const SkPathOp op) {
|
| #if DEBUG_SHOW_TEST_NAME
|
|
|
| void ShowFunctionHeader(const char* functionName) {
|
| - SkDebugf("\nstatic void %s(skiatest::Reporter* reporter) {\n", functionName);
|
| + SkDebugf("\nstatic void %s(skiatest::Reporter* reporter, const char* filename) {\n", functionName);
|
| if (strcmp("skphealth_com76", functionName) == 0) {
|
| SkDebugf("found it\n");
|
| }
|
| @@ -232,7 +233,7 @@ static const char* gOpStrs[] = {
|
| };
|
|
|
| void ShowOp(SkPathOp op, const char* pathOne, const char* pathTwo) {
|
| - SkDebugf(" testPathOp(reporter, %s, %s, %s);\n", pathOne, pathTwo, gOpStrs[op]);
|
| + SkDebugf(" testPathOp(reporter, %s, %s, %s, filename);\n", pathOne, pathTwo, gOpStrs[op]);
|
| SkDebugf("}\n");
|
| }
|
| #endif
|
| @@ -320,9 +321,6 @@ static int pathsDrawTheSame(SkBitmap& bits, const SkPath& scaledOne, const SkPat
|
| }
|
| }
|
| }
|
| - if (errors2 >= 6 || errors > 160) {
|
| - SkDebugf("%s errors2=%d errors=%d\n", __FUNCTION__, errors2, errors);
|
| - }
|
| error2x2 = errors2;
|
| return errors;
|
| }
|
| @@ -383,76 +381,82 @@ bool drawAsciiPaths(const SkPath& one, const SkPath& two, bool drawPaths) {
|
| return true;
|
| }
|
|
|
| -static void showSimplifiedPath(const SkPath& one, const SkPath& two,
|
| - const SkPath& scaledOne, const SkPath& scaledTwo) {
|
| - showPath(one, "path", false);
|
| - drawAsciiPaths(scaledOne, scaledTwo, true);
|
| -}
|
| -
|
| -static int comparePaths(skiatest::Reporter* reporter, const SkPath& one, const SkPath& two,
|
| - SkBitmap& bitmap) {
|
| +static int comparePaths(skiatest::Reporter* reporter, const char* filename, const SkPath& one,
|
| + const SkPath& two, SkBitmap& bitmap) {
|
| int errors2x2;
|
| SkPath scaledOne, scaledTwo;
|
| - int errors = pathsDrawTheSame(one, two, bitmap, scaledOne, scaledTwo, errors2x2);
|
| + (void) pathsDrawTheSame(one, two, bitmap, scaledOne, scaledTwo, errors2x2);
|
| if (errors2x2 == 0) {
|
| return 0;
|
| }
|
| const int MAX_ERRORS = 9;
|
| - if (errors2x2 == MAX_ERRORS || errors2x2 == MAX_ERRORS - 1) {
|
| - showSimplifiedPath(one, two, scaledOne, scaledTwo);
|
| - }
|
| - if (errors2x2 > MAX_ERRORS && gComparePathsAssert) {
|
| - SkDebugf("%s errors=%d\n", __FUNCTION__, errors);
|
| - showSimplifiedPath(one, two, scaledOne, scaledTwo);
|
| - REPORTER_ASSERT(reporter, 0);
|
| - }
|
| + REPORTER_ASSERT(reporter, errors2x2 <= MAX_ERRORS || !gComparePathsAssert);
|
| return errors2x2 > MAX_ERRORS ? errors2x2 : 0;
|
| }
|
|
|
| -static void showPathOpPath(const SkPath& one, const SkPath& two, const SkPath& a, const SkPath& b,
|
| - const SkPath& scaledOne, const SkPath& scaledTwo, const SkPathOp shapeOp,
|
| - const SkMatrix& scale) {
|
| +const int gTestFirst = 4;
|
| +static int gTestNo = gTestFirst;
|
| +static SkTDArray<SkPathOp> gTestOp;
|
| +
|
| +static void showPathOpPath(const char* testName, const SkPath& one, const SkPath& two,
|
| + const SkPath& a, const SkPath& b, const SkPath& scaledOne, const SkPath& scaledTwo,
|
| + const SkPathOp shapeOp, const SkMatrix& scale) {
|
| SkASSERT((unsigned) shapeOp < SK_ARRAY_COUNT(opStrs));
|
| - SkDebugf("static void xOp#%s(skiatest::Reporter* reporter) {\n", opSuffixes[shapeOp]);
|
| + SkString defaultTestName;
|
| + if (!testName) {
|
| + defaultTestName.printf("xOp%d%s", gTestNo, opSuffixes[shapeOp]);
|
| + testName = defaultTestName.c_str();
|
| + }
|
| + SkDebugf("static void %s(skiatest::Reporter* reporter, const char* filename) {\n", testName);
|
| + *gTestOp.append() = shapeOp;
|
| + ++gTestNo;
|
| SkDebugf(" SkPath path, pathB;\n");
|
| showPath(a, "path", false);
|
| showPath(b, "pathB", false);
|
| - SkDebugf(" testPathOp(reporter, path, pathB, %s);\n", opStrs[shapeOp]);
|
| + SkDebugf(" testPathOp(reporter, path, pathB, %s, filename);\n", opStrs[shapeOp]);
|
| SkDebugf("}\n");
|
| - drawAsciiPaths(scaledOne, scaledTwo, true);
|
| + drawAsciiPaths(scaledOne, scaledTwo, false);
|
| +}
|
| +
|
| +void ShowTestArray() {
|
| + for (int x = gTestFirst; x < gTestNo; ++x) {
|
| + SkDebugf(" TEST(xOp%d%s),\n", x, opSuffixes[gTestOp[x - gTestFirst]]);
|
| + }
|
| }
|
|
|
| -static int comparePaths(skiatest::Reporter* reporter, const SkPath& one, const SkPath& scaledOne,
|
| - const SkPath& two, const SkPath& scaledTwo, SkBitmap& bitmap,
|
| - const SkPath& a, const SkPath& b, const SkPathOp shapeOp,
|
| - const SkMatrix& scale) {
|
| +static int comparePaths(skiatest::Reporter* reporter, const char* testName, const SkPath& one,
|
| + const SkPath& scaledOne, const SkPath& two, const SkPath& scaledTwo, SkBitmap& bitmap,
|
| + const SkPath& a, const SkPath& b, const SkPathOp shapeOp, const SkMatrix& scale) {
|
| int errors2x2;
|
| - int errors = pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2);
|
| + (void) pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2);
|
| if (errors2x2 == 0) {
|
| if (gShowPath) {
|
| - showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
|
| + showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
|
| }
|
| return 0;
|
| }
|
| const int MAX_ERRORS = 8;
|
| - if (gShowPath || errors2x2 == MAX_ERRORS || errors2x2 == MAX_ERRORS - 1) {
|
| - showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
|
| - }
|
| if (errors2x2 > MAX_ERRORS && gComparePathsAssert) {
|
| - SkDebugf("%s errors=%d\n", __FUNCTION__, errors);
|
| - showPathOpPath(one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
|
| + SK_DECLARE_STATIC_MUTEX(compareDebugOut3);
|
| + SkAutoMutexAcquire autoM(compareDebugOut3);
|
| + showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
|
| REPORTER_ASSERT(reporter, 0);
|
| + } else if (gShowPath || errors2x2 == MAX_ERRORS || errors2x2 == MAX_ERRORS - 1) {
|
| + SK_DECLARE_STATIC_MUTEX(compareDebugOut4);
|
| + SkAutoMutexAcquire autoM(compareDebugOut4);
|
| + showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale);
|
| }
|
| return errors2x2 > MAX_ERRORS ? errors2x2 : 0;
|
| }
|
|
|
| // Default values for when reporter->verbose() is false.
|
| -static int testNumber = 1;
|
| +static int testNumber = 55;
|
| static const char* testName = "pathOpTest";
|
|
|
| static void writeTestName(const char* nameSuffix, SkMemoryWStream& outFile) {
|
| outFile.writeText(testName);
|
| outFile.writeDecAsText(testNumber);
|
| + ++testNumber;
|
| if (nameSuffix) {
|
| outFile.writeText(nameSuffix);
|
| }
|
| @@ -460,6 +464,7 @@ static void writeTestName(const char* nameSuffix, SkMemoryWStream& outFile) {
|
|
|
| static void outputToStream(const char* pathStr, const char* pathPrefix, const char* nameSuffix,
|
| const char* testFunction, bool twoPaths, SkMemoryWStream& outFile) {
|
| +#if 0
|
| outFile.writeText("<div id=\"");
|
| writeTestName(nameSuffix, outFile);
|
| outFile.writeText("\">\n");
|
| @@ -473,10 +478,10 @@ static void outputToStream(const char* pathStr, const char* pathPrefix, const ch
|
| outFile.writeText(" ");
|
| writeTestName(nameSuffix, outFile);
|
| outFile.writeText(",\n\n\n");
|
| -
|
| +#endif
|
| outFile.writeText("static void ");
|
| writeTestName(nameSuffix, outFile);
|
| - outFile.writeText("() {\n SkPath path");
|
| + outFile.writeText("(skiatest::Reporter* reporter) {\n SkPath path");
|
| if (twoPaths) {
|
| outFile.writeText(", pathB");
|
| }
|
| @@ -488,6 +493,7 @@ static void outputToStream(const char* pathStr, const char* pathPrefix, const ch
|
| outFile.writeText(" ");
|
| outFile.writeText(testFunction);
|
| outFile.writeText("\n}\n\n");
|
| +#if 0
|
| outFile.writeText("static void (*firstTest)() = ");
|
| writeTestName(nameSuffix, outFile);
|
| outFile.writeText(";\n\n");
|
| @@ -499,6 +505,7 @@ static void outputToStream(const char* pathStr, const char* pathPrefix, const ch
|
| outFile.writeText(" TEST(");
|
| writeTestName(nameSuffix, outFile);
|
| outFile.writeText("),\n");
|
| +#endif
|
| outFile.flush();
|
| }
|
|
|
| @@ -517,8 +524,10 @@ bool testSimplify(SkPath& path, bool useXor, SkPath& out, PathOpsThreadState& st
|
| if (!state.fReporter->verbose()) {
|
| return true;
|
| }
|
| - int result = comparePaths(state.fReporter, path, out, *state.fBitmap);
|
| + int result = comparePaths(state.fReporter, NULL, path, out, *state.fBitmap);
|
| if (result && gPathStrAssert) {
|
| + SK_DECLARE_STATIC_MUTEX(simplifyDebugOut);
|
| + SkAutoMutexAcquire autoM(simplifyDebugOut);
|
| char temp[8192];
|
| sk_bzero(temp, sizeof(temp));
|
| SkMemoryWStream stream(temp, sizeof(temp));
|
| @@ -528,7 +537,7 @@ bool testSimplify(SkPath& path, bool useXor, SkPath& out, PathOpsThreadState& st
|
| pathPrefix = " path.setFillType(SkPath::kEvenOdd_FillType);\n";
|
| nameSuffix = "x";
|
| }
|
| - const char testFunction[] = "testSimplifyx(path);";
|
| + const char testFunction[] = "testSimplify(reporter, path);";
|
| outputToStream(pathStr, pathPrefix, nameSuffix, testFunction, false, stream);
|
| SkDebugf(temp);
|
| REPORTER_ASSERT(state.fReporter, 0);
|
| @@ -537,7 +546,7 @@ bool testSimplify(SkPath& path, bool useXor, SkPath& out, PathOpsThreadState& st
|
| return result == 0;
|
| }
|
|
|
| -bool testSimplify(skiatest::Reporter* reporter, const SkPath& path) {
|
| +bool testSimplify(skiatest::Reporter* reporter, const SkPath& path, const char* filename) {
|
| #if DEBUG_SHOW_TEST_NAME
|
| showPathData(path);
|
| #endif
|
| @@ -548,7 +557,7 @@ bool testSimplify(skiatest::Reporter* reporter, const SkPath& path) {
|
| return false;
|
| }
|
| SkBitmap bitmap;
|
| - int result = comparePaths(reporter, path, out, bitmap);
|
| + int result = comparePaths(reporter, filename, path, out, bitmap);
|
| if (result && gPathStrAssert) {
|
| REPORTER_ASSERT(reporter, 0);
|
| }
|
| @@ -566,17 +575,19 @@ void SkPathOpsDebug::ShowPath(const SkPath& a, const SkPath& b, SkPathOp shapeOp
|
| }
|
| #endif
|
|
|
| +#if DEBUG_SHOW_TEST_NAME
|
| +static void showName(const SkPath& a, const SkPath& b, const SkPathOp shapeOp) {
|
| + SkDebugf("\n");
|
| + showPathData(a);
|
| + showOp(shapeOp);
|
| + showPathData(b);
|
| +}
|
| +#endif
|
| +
|
| static bool innerPathOp(skiatest::Reporter* reporter, const SkPath& a, const SkPath& b,
|
| const SkPathOp shapeOp, const char* testName, bool threaded) {
|
| #if DEBUG_SHOW_TEST_NAME
|
| - if (testName == NULL) {
|
| - SkDebugf("\n");
|
| - showPathData(a);
|
| - showOp(shapeOp);
|
| - showPathData(b);
|
| - } else {
|
| - SkPathOpsDebug::ShowPath(a, b, shapeOp, testName);
|
| - }
|
| + showName(a, b, shapeOp);
|
| #endif
|
| SkPath out;
|
| if (!Op(a, b, shapeOp, &out) ) {
|
| @@ -611,8 +622,8 @@ static bool innerPathOp(skiatest::Reporter* reporter, const SkPath& a, const SkP
|
| SkPath scaledOut;
|
| scaledOut.addPath(out, scale);
|
| scaledOut.setFillType(out.getFillType());
|
| - int result = comparePaths(reporter, pathOut, scaledPathOut, out, scaledOut, bitmap, a, b,
|
| - shapeOp, scale);
|
| + int result = comparePaths(reporter, testName, pathOut, scaledPathOut, out, scaledOut, bitmap,
|
| + a, b, shapeOp, scale);
|
| if (result && gPathStrAssert) {
|
| REPORTER_ASSERT(reporter, 0);
|
| }
|
| @@ -625,6 +636,20 @@ bool testPathOp(skiatest::Reporter* reporter, const SkPath& a, const SkPath& b,
|
| return innerPathOp(reporter, a, b, shapeOp, testName, false);
|
| }
|
|
|
| +bool testPathFailOp(skiatest::Reporter* reporter, const SkPath& a, const SkPath& b,
|
| + const SkPathOp shapeOp, const char* testName) {
|
| +#if DEBUG_SHOW_TEST_NAME
|
| + showName(a, b, shapeOp);
|
| +#endif
|
| + SkPath out;
|
| + if (Op(a, b, shapeOp, &out) ) {
|
| + SkDebugf("%s test is expected to fail\n", __FUNCTION__);
|
| + REPORTER_ASSERT(reporter, 0);
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| bool testThreadedPathOp(skiatest::Reporter* reporter, const SkPath& a, const SkPath& b,
|
| const SkPathOp shapeOp, const char* testName) {
|
| return innerPathOp(reporter, a, b, shapeOp, testName, true);
|
| @@ -648,7 +673,7 @@ int initializeTests(skiatest::Reporter* reporter, const char* test) {
|
| SkFILEStream inFile("../../experimental/Intersection/op.htm");
|
| if (inFile.isValid()) {
|
| SkTDArray<char> inData;
|
| - inData.setCount(inFile.getLength());
|
| + inData.setCount((int) inFile.getLength());
|
| size_t inLen = inData.count();
|
| inFile.read(inData.begin(), inLen);
|
| inFile.setPath(NULL);
|
| @@ -684,8 +709,8 @@ void outputProgress(char* ramStr, const char* pathStr, SkPathOp op) {
|
| }
|
|
|
| void RunTestSet(skiatest::Reporter* reporter, TestDesc tests[], size_t count,
|
| - void (*firstTest)(skiatest::Reporter* ),
|
| - void (*stopTest)(skiatest::Reporter* ), bool reverse) {
|
| + void (*firstTest)(skiatest::Reporter* , const char* filename),
|
| + void (*stopTest)(skiatest::Reporter* , const char* filename), bool reverse) {
|
| size_t index;
|
| if (firstTest) {
|
| index = count - 1;
|
| @@ -693,10 +718,13 @@ void RunTestSet(skiatest::Reporter* reporter, TestDesc tests[], size_t count,
|
| --index;
|
| }
|
| #if DEBUG_SHOW_TEST_NAME
|
| - SkDebugf("<div id=\"%s\">\n", tests[index].str);
|
| - SkDebugf(" %s [%s]\n", __FUNCTION__, tests[index].str);
|
| + SkDebugf("<div id=\"%s\">\n", tests[index].str);
|
| + SkDebugf(" %s [%s]\n", __FUNCTION__, tests[index].str);
|
| #endif
|
| - (*tests[index].fun)(reporter);
|
| + (*tests[index].fun)(reporter, tests[index].str);
|
| + if (tests[index].fun == stopTest) {
|
| + return;
|
| + }
|
| }
|
| index = reverse ? count - 1 : 0;
|
| size_t last = reverse ? 0 : count - 1;
|
| @@ -706,10 +734,11 @@ void RunTestSet(skiatest::Reporter* reporter, TestDesc tests[], size_t count,
|
| SkDebugf("<div id=\"%s\">\n", tests[index].str);
|
| SkDebugf(" %s [%s]\n", __FUNCTION__, tests[index].str);
|
| #endif
|
| - (*tests[index].fun)(reporter);
|
| + (*tests[index].fun)(reporter, tests[index].str);
|
| }
|
| if (tests[index].fun == stopTest) {
|
| SkDebugf("lastTest\n");
|
| + break;
|
| }
|
| if (index == last) {
|
| break;
|
|
|