Sketch DM refactor.

BUG=skia:3255

I think this supports everything DM used to, but has completely refactored how
it works to fit the design in the bug.

Configs like "tiles-gpu" are automatically wired up.

I wouldn't suggest looking at this as a diff.  There's just a bunch of deleted
files, a few new files, and one new file that shares a name with a deleted file
(DM.cpp).

NOTREECHECKS=true

Committed: https://skia.googlesource.com/skia/+/709d2c3e5062c5b57f91273bfc11a751f5b2bb88

Review URL: https://codereview.chromium.org/788243008
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
new file mode 100644
index 0000000..3f88f63
--- /dev/null
+++ b/dm/DMSrcSink.h
@@ -0,0 +1,177 @@
+#ifndef DMSrcSink_DEFINED
+#define DMSrcSink_DEFINED
+
+#include "DMGpuSupport.h"
+#include "SkBBHFactory.h"
+#include "SkBBoxHierarchy.h"
+#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkData.h"
+#include "SkGPipe.h"
+#include "SkPicture.h"
+#include "SkStream.h"
+#include "gm.h"
+
+namespace DM {
+
+// This is just convenience.  It lets you use either return "foo" or return SkStringPrintf(...).
+struct ImplicitString : public SkString {
+    template <typename T>
+    ImplicitString(const T& s) : SkString(s) {}
+};
+typedef ImplicitString Error;
+typedef ImplicitString Name;
+
+struct Src {
+    // All Srcs must be thread safe.
+    virtual ~Src() {}
+    virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
+    virtual SkISize size() const = 0;
+    virtual Name name() const = 0;
+};
+
+struct Sink {
+    virtual ~Sink() {}
+    // You may write to either the bitmap or stream.
+    virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*) const
+        = 0;
+    // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
+    virtual int enclave() const = 0;
+
+    // File extension for the content draw() outputs, e.g. "png", "pdf".
+    virtual const char* fileExtension() const  = 0;
+};
+
+enum { kAnyThread_Enclave, kGPUSink_Enclave, kPDFSink_Enclave };
+static const int kNumEnclaves = kPDFSink_Enclave + 1;
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+void SafeUnref(SkPicture*);  // These need external linkage (and specific types).
+void SafeUnref(SkData*);
+
+class GMSrc : public Src {
+public:
+    explicit GMSrc(skiagm::GMRegistry::Factory);
+
+    Error draw(SkCanvas*) const SK_OVERRIDE;
+    SkISize size() const SK_OVERRIDE;
+    Name name() const SK_OVERRIDE;
+private:
+    skiagm::GMRegistry::Factory fFactory;
+};
+
+class ImageSrc : public Src {
+public:
+    explicit ImageSrc(SkString path, int subsets = 0);
+
+    Error draw(SkCanvas*) const SK_OVERRIDE;
+    SkISize size() const SK_OVERRIDE;
+    Name name() const SK_OVERRIDE;
+private:
+    SkString                     fPath;
+    int                          fSubsets;
+    SkLazyPtr<SkData, SafeUnref> fEncoded;
+};
+
+class SKPSrc : public Src {
+public:
+    explicit SKPSrc(SkString path);
+
+    Error draw(SkCanvas*) const SK_OVERRIDE;
+    SkISize size() const SK_OVERRIDE;
+    Name name() const SK_OVERRIDE;
+private:
+    SkString                        fPath;
+    SkLazyPtr<SkPicture, SafeUnref> fPic;
+};
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+class GPUSink : public Sink {
+public:
+    GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE;
+    const char* fileExtension() const SK_OVERRIDE { return "png"; }
+private:
+    GrContextFactory::GLContextType fContextType;
+    GrGLStandard                    fGpuAPI;
+    int                             fSampleCount;
+    bool                            fUseDFText;
+};
+
+class PDFSink : public Sink {
+public:
+    PDFSink();
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; }
+    const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
+};
+
+class RasterSink : public Sink {
+public:
+    explicit RasterSink(SkColorType);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
+    const char* fileExtension() const SK_OVERRIDE { return "png"; }
+private:
+    SkColorType    fColorType;
+};
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+class ViaMatrix : public Sink {
+public:
+    ViaMatrix(SkMatrix, Sink*);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return fSink->enclave(); }
+    const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
+private:
+    SkMatrix            fMatrix;
+    SkAutoTDelete<Sink> fSink;
+};
+
+class ViaPipe : public Sink {
+public:
+    ViaPipe(int flags, Sink*);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return fSink->enclave(); }
+    const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
+private:
+    SkGPipeWriter::Flags fFlags;
+    SkAutoTDelete<Sink>  fSink;
+};
+
+class ViaSerialization : public Sink {
+public:
+    explicit ViaSerialization(Sink*);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return fSink->enclave(); }
+    const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
+private:
+    SkAutoTDelete<Sink> fSink;
+};
+
+class ViaTiles : public Sink {
+public:
+    ViaTiles(int w, int h, SkBBHFactory*, Sink*);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return fSink->enclave(); }
+    const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
+private:
+    const int                   fW, fH;
+    SkAutoTDelete<SkBBHFactory> fFactory;
+    SkAutoTDelete<Sink>         fSink;
+};
+
+}  // namespace DM
+
+#endif//DMSrcSink_DEFINED