static int comparePaths(const SkPath& one, const SkPath& two, SkBitmap& bitmap, SkCanvas* canvas) { int errors = pathsDrawTheSame(one, two, bitmap, canvas); if (errors == 0) { return 0; } drawAsciiPaths(one, two, gDrawAllAsciiPaths); for (int x = 9; x <= 33; ++x) { errors = scaledDrawTheSame(one, two, x, x - (x >> 2), gDrawAllAsciiPaths, bitmap, canvas); if (errors == 0) { return 0; } } if (!gDrawAllAsciiPaths) { errors = scaledDrawTheSame(one, two, 9, 7, false, bitmap, canvas); if (errors > 4) { scaledDrawTheSame(one, two, 9, 7, true, bitmap, canvas); } } if (errors > 0) SkDebugf("\n%s errors=%d\n", __FUNCTION__, errors); if (errors > 4 && gComparePathsAssert) { showPath(one); showPath(two, "simplified:"); SkASSERT(0); } return errors; }
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, bool expectSuccess) { int errors2x2; const int MAX_ERRORS = 8; (void) pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2); if (!expectSuccess) { if (errors2x2 < MAX_ERRORS) { REPORTER_ASSERT(reporter, 0); } return 0; } if (errors2x2 == 0) { return 0; } if (errors2x2 >= MAX_ERRORS) { SkAutoMutexAcquire autoM(compareDebugOut3); showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale); SkDebugf("\n/*"); REPORTER_ASSERT(reporter, 0); SkDebugf(" */\n"); } return errors2x2 >= MAX_ERRORS ? errors2x2 : 0; }
static int pathsDrawTheSame(const SkPath& one, const SkPath& two, SkBitmap& bits, SkPath& scaledOne, SkPath& scaledTwo, int& error2x2) { SkMatrix scale; scaleMatrix(one, two, scale); one.transform(scale, &scaledOne); two.transform(scale, &scaledTwo); return pathsDrawTheSame(bits, scaledOne, scaledTwo, error2x2); }
int comparePaths(skiatest::Reporter* reporter, const char* filename, const SkPath& one, const SkPath& two, SkBitmap& bitmap) { int errors2x2; SkPath scaledOne, scaledTwo; (void) pathsDrawTheSame(one, two, bitmap, scaledOne, scaledTwo, errors2x2); if (errors2x2 == 0) { return 0; } const int MAX_ERRORS = 9; return errors2x2 > MAX_ERRORS ? errors2x2 : 0; }
int comparePaths(const SkPath& one, const SkPath& two, SkBitmap& bitmap) { int errors2x2; SkPath scaledOne, scaledTwo; int errors = 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); SkASSERT(0); } return errors2x2 > MAX_ERRORS ? errors2x2 : 0; }
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) { int errors2x2; int errors = pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2); if (errors2x2 == 0) { if (gShowPath) { showPathOpPath(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); REPORTER_ASSERT(reporter, 0); } return errors2x2 > MAX_ERRORS ? errors2x2 : 0; }
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; (void) pathsDrawTheSame(bitmap, scaledOne, scaledTwo, errors2x2); if (errors2x2 == 0) { if (gShowPath) { showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale); } return 0; } const int MAX_ERRORS = 8; if (errors2x2 > MAX_ERRORS && gComparePathsAssert) { 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) { SkAutoMutexAcquire autoM(compareDebugOut4); showPathOpPath(testName, one, two, a, b, scaledOne, scaledTwo, shapeOp, scale); } return errors2x2 > MAX_ERRORS ? errors2x2 : 0; }
static int scaledDrawTheSame(const SkPath& one, const SkPath& two, int a, int b, bool drawPaths, SkBitmap& bitmap, SkCanvas* canvas) { SkMatrix scale; scale.reset(); float aScale = 1.21f; float bScale = 1.11f; scale.preScale(a * aScale, b * bScale); SkPath scaledOne, scaledTwo; one.transform(scale, &scaledOne); two.transform(scale, &scaledTwo); int errors = pathsDrawTheSame(scaledOne, scaledTwo, bitmap, canvas); if (errors == 0) { return 0; } while (!drawAsciiPaths(scaledOne, scaledTwo, drawPaths)) { scale.reset(); aScale *= 0.5f; bScale *= 0.5f; scale.preScale(a * aScale, b * bScale); one.transform(scale, &scaledOne); two.transform(scale, &scaledTwo); } return errors; }