Index: src/pathops/SkPathOpsOp.cpp |
diff --git a/src/pathops/SkPathOpsOp.cpp b/src/pathops/SkPathOpsOp.cpp |
index e622451a92534c27a4ad59693b166a1e9a370d3f..f423ba9123b8f5a80f05bed23754a5008585723c 100644 |
--- a/src/pathops/SkPathOpsOp.cpp |
+++ b/src/pathops/SkPathOpsOp.cpp |
@@ -198,44 +198,6 @@ static const bool gOutInverse[kReverseDifference_SkPathOp + 1][2][2] = { |
{{ false, true }, { false, false }}, // rev diff |
}; |
-#define DEBUGGING_PATHOPS_FROM_HOST 0 // enable to debug svg in chrome -- note path hardcoded below |
-#if DEBUGGING_PATHOPS_FROM_HOST |
-#include "SkData.h" |
-#include "SkStream.h" |
- |
-static void dump_path(FILE* file, const SkPath& path, bool force, bool dumpAsHex) { |
- SkDynamicMemoryWStream wStream; |
- path.dump(&wStream, force, dumpAsHex); |
- sk_sp<SkData> data(wStream.detachAsData()); |
- fprintf(file, "%.*s\n", (int) data->size(), (char*) data->data()); |
-} |
- |
-static int dumpID = 0; |
- |
-static void dump_op(const SkPath& one, const SkPath& two, SkPathOp op) { |
-#if SK_BUILD_FOR_MAC |
- FILE* file = fopen("/Users/caryclark/Documents/svgop.txt", "w"); |
-#else |
- FILE* file = fopen("/usr/local/google/home/caryclark/Documents/svgop.txt", "w"); |
-#endif |
- fprintf(file, |
- "\nstatic void fuzz763_%d(skiatest::Reporter* reporter, const char* filename) {\n", |
- ++dumpID); |
- fprintf(file, " SkPath path;\n"); |
- fprintf(file, " path.setFillType((SkPath::FillType) %d);\n", one.getFillType()); |
- dump_path(file, one, false, true); |
- fprintf(file, " SkPath path1(path);\n"); |
- fprintf(file, " path.reset();\n"); |
- fprintf(file, " path.setFillType((SkPath::FillType) %d);\n", two.getFillType()); |
- dump_path(file, two, false, true); |
- fprintf(file, " SkPath path2(path);\n"); |
- fprintf(file, " testPathOp(reporter, path1, path2, (SkPathOp) %d, filename);\n", op); |
- fprintf(file, "}\n"); |
- fclose(file); |
-} |
-#endif |
- |
- |
#if DEBUG_T_SECT_LOOP_COUNT |
#include "SkMutex.h" |
@@ -261,8 +223,10 @@ bool OpDebug(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result |
SkOpGlobalState globalState(contourList, &allocator |
SkDEBUGPARAMS(skipAssert) SkDEBUGPARAMS(testName)); |
SkOpCoincidence coincidence(&globalState); |
-#if DEBUGGING_PATHOPS_FROM_HOST |
- dump_op(one, two, op); |
+#ifdef SK_DEBUG |
+ if (SkPathOpsDebug::gDumpOp) { |
+ SkPathOpsDebug::DumpOp(one, two, op, testName); |
+ } |
#endif |
op = gOpInverse[op][one.isInverseFillType()][two.isInverseFillType()]; |
SkPath::FillType fillType = gOutInverse[op][one.isInverseFillType()][two.isInverseFillType()] |
@@ -351,122 +315,16 @@ bool OpDebug(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result |
return true; |
} |
-#define DEBUG_VERIFY 0 |
- |
-#if DEBUG_VERIFY |
-#include "SkBitmap.h" |
-#include "SkCanvas.h" |
-#include "SkPaint.h" |
- |
-const int bitWidth = 64; |
-const int bitHeight = 64; |
- |
-static void debug_scale_matrix(const SkPath& one, const SkPath& two, SkMatrix& scale) { |
- SkRect larger = one.getBounds(); |
- larger.join(two.getBounds()); |
- SkScalar largerWidth = larger.width(); |
- if (largerWidth < 4) { |
- largerWidth = 4; |
- } |
- SkScalar largerHeight = larger.height(); |
- if (largerHeight < 4) { |
- largerHeight = 4; |
- } |
- SkScalar hScale = (bitWidth - 2) / largerWidth; |
- SkScalar vScale = (bitHeight - 2) / largerHeight; |
- scale.reset(); |
- scale.preScale(hScale, vScale); |
- larger.fLeft *= hScale; |
- larger.fRight *= hScale; |
- larger.fTop *= vScale; |
- larger.fBottom *= vScale; |
- SkScalar dx = -16000 > larger.fLeft ? -16000 - larger.fLeft |
- : 16000 < larger.fRight ? 16000 - larger.fRight : 0; |
- SkScalar dy = -16000 > larger.fTop ? -16000 - larger.fTop |
- : 16000 < larger.fBottom ? 16000 - larger.fBottom : 0; |
- scale.preTranslate(dx, dy); |
-} |
- |
-static int debug_paths_draw_the_same(const SkPath& one, const SkPath& two, SkBitmap& bits) { |
- if (bits.width() == 0) { |
- bits.allocN32Pixels(bitWidth * 2, bitHeight); |
- } |
- SkCanvas canvas(bits); |
- canvas.drawColor(SK_ColorWHITE); |
- SkPaint paint; |
- canvas.save(); |
- const SkRect& bounds1 = one.getBounds(); |
- canvas.translate(-bounds1.fLeft + 1, -bounds1.fTop + 1); |
- canvas.drawPath(one, paint); |
- canvas.restore(); |
- canvas.save(); |
- canvas.translate(-bounds1.fLeft + 1 + bitWidth, -bounds1.fTop + 1); |
- canvas.drawPath(two, paint); |
- canvas.restore(); |
- int errors = 0; |
- for (int y = 0; y < bitHeight - 1; ++y) { |
- uint32_t* addr1 = bits.getAddr32(0, y); |
- uint32_t* addr2 = bits.getAddr32(0, y + 1); |
- uint32_t* addr3 = bits.getAddr32(bitWidth, y); |
- uint32_t* addr4 = bits.getAddr32(bitWidth, y + 1); |
- for (int x = 0; x < bitWidth - 1; ++x) { |
- // count 2x2 blocks |
- bool err = addr1[x] != addr3[x]; |
- if (err) { |
- errors += addr1[x + 1] != addr3[x + 1] |
- && addr2[x] != addr4[x] && addr2[x + 1] != addr4[x + 1]; |
- } |
+bool Op(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result) { |
+#ifdef SK_DEBUG |
+ if (SkPathOpsDebug::gVerifyOp) { |
+ if (!OpDebug(one, two, op, result SkDEBUGPARAMS(false) SkDEBUGPARAMS(nullptr))) { |
+ SkPathOpsDebug::ReportOpFail(one, two, op); |
+ return false; |
} |
+ SkPathOpsDebug::VerifyOp(one, two, op, *result); |
+ return true; |
} |
- return errors; |
-} |
- |
#endif |
- |
-bool Op(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result) { |
-#if DEBUG_VERIFY |
- if (!OpDebug(one, two, op, result SkDEBUGPARAMS(nullptr))) { |
- SkDebugf("%s did not expect failure\none: fill=%d\n", __FUNCTION__, one.getFillType()); |
- one.dumpHex(); |
- SkDebugf("two: fill=%d\n", two.getFillType()); |
- two.dumpHex(); |
- SkASSERT(0); |
- return false; |
- } |
- SkPath pathOut, scaledPathOut; |
- SkRegion rgnA, rgnB, openClip, rgnOut; |
- openClip.setRect(-16000, -16000, 16000, 16000); |
- rgnA.setPath(one, openClip); |
- rgnB.setPath(two, openClip); |
- rgnOut.op(rgnA, rgnB, (SkRegion::Op) op); |
- rgnOut.getBoundaryPath(&pathOut); |
- SkMatrix scale; |
- debug_scale_matrix(one, two, scale); |
- SkRegion scaledRgnA, scaledRgnB, scaledRgnOut; |
- SkPath scaledA, scaledB; |
- scaledA.addPath(one, scale); |
- scaledA.setFillType(one.getFillType()); |
- scaledB.addPath(two, scale); |
- scaledB.setFillType(two.getFillType()); |
- scaledRgnA.setPath(scaledA, openClip); |
- scaledRgnB.setPath(scaledB, openClip); |
- scaledRgnOut.op(scaledRgnA, scaledRgnB, (SkRegion::Op) op); |
- scaledRgnOut.getBoundaryPath(&scaledPathOut); |
- SkBitmap bitmap; |
- SkPath scaledOut; |
- scaledOut.addPath(*result, scale); |
- scaledOut.setFillType(result->getFillType()); |
- int errors = debug_paths_draw_the_same(scaledPathOut, scaledOut, bitmap); |
- const int MAX_ERRORS = 9; |
- if (errors > MAX_ERRORS) { |
- SkDebugf("%s did not expect failure\none: fill=%d\n", __FUNCTION__, one.getFillType()); |
- one.dumpHex(); |
- SkDebugf("two: fill=%d\n", two.getFillType()); |
- two.dumpHex(); |
- SkASSERT(0); |
- } |
- return true; |
-#else |
return OpDebug(one, two, op, result SkDEBUGPARAMS(true) SkDEBUGPARAMS(nullptr)); |
-#endif |
} |