DM::NullSink

Motivation:  The null sink can act as a control for experiments.

Review URL: https://codereview.chromium.org/873723007
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 15c1cfa..e162e77 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -221,6 +221,7 @@
         SINK("8888", RasterSink, kN32_SkColorType);
         SINK("pdf",  PDFSink);
         SINK("skp",  SKPSink);
+        SINK("null",  NullSink);
     }
 #undef SINK
     return NULL;
@@ -339,7 +340,8 @@
                 const char* ext = task->sink->fileExtension();
                 if (data->getLength()) {
                     WriteToDisk(*task, md5, ext, data, data->getLength(), NULL);
-                } else {
+                    SkASSERT(bitmap.drawsNothing());
+                } else if (!bitmap.drawsNothing()) {
                     WriteToDisk(*task, md5, ext, NULL, 0, &bitmap);
                 }
             }
diff --git a/dm/DMJsonWriter.cpp b/dm/DMJsonWriter.cpp
index 56c1301..8f1fa7e 100644
--- a/dm/DMJsonWriter.cpp
+++ b/dm/DMJsonWriter.cpp
@@ -75,6 +75,7 @@
     }
 
     SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json");
+    sk_mkdir(FLAGS_writePath[0]);
     SkFILEWStream stream(path.c_str());
     stream.writeText(Json::StyledWriter().write(root).c_str());
     stream.flush();
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index e163a24..67c8e5c 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -8,6 +8,7 @@
 #include "SkCanvas.h"
 #include "SkData.h"
 #include "SkGPipe.h"
+#include "SkNullCanvas.h"
 #include "SkPicture.h"
 #include "gm.h"
 
@@ -175,6 +176,15 @@
     SkAutoTDelete<Sink>         fSink;
 };
 
+class NullSink : public Sink {
+public:
+    Error draw(const Src& src, SkBitmap*, SkWStream* out) const SK_OVERRIDE {
+        return src.draw(SkCreateNullCanvas());
+    }
+    int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
+    const char* fileExtension() const SK_OVERRIDE { return ""; }
+};
+
 }  // namespace DM
 
 #endif//DMSrcSink_DEFINED