SVG backend in DM

Not enabled by default, but this should get you SKPs, GMs etc for free to play with.

$ out/Debug/dm -w svgs --src gm skp --config svg

BUG=skia:

Review URL: https://codereview.chromium.org/892693002
diff --git a/dm/DM.cpp b/dm/DM.cpp
index f087a32..c8d1ec7 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -221,7 +221,8 @@
         SINK("8888", RasterSink, kN32_SkColorType);
         SINK("pdf",  PDFSink);
         SINK("skp",  SKPSink);
-        SINK("null",  NullSink);
+        SINK("svg",  SVGSink);
+        SINK("null", NullSink);
     }
 #undef SINK
     return NULL;
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index f3ed574..baf1871 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -6,6 +6,7 @@
 #include "SkOSFile.h"
 #include "SkPictureRecorder.h"
 #include "SkRandom.h"
+#include "SkSVGDevice.h"
 #include "SkStream.h"
 
 namespace DM {
@@ -227,6 +228,16 @@
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
+SVGSink::SVGSink() {}
+
+Error SVGSink::draw(const Src& src, SkBitmap*, SkWStream* dst) const {
+    SkAutoTUnref<SkBaseDevice> device(SkSVGDevice::Create(src.size(), dst));
+    SkCanvas canvas(device);
+    return src.draw(&canvas);
+}
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
 RasterSink::RasterSink(SkColorType colorType) : fColorType(colorType) {}
 
 Error RasterSink::draw(const Src& src, SkBitmap* dst, SkWStream*) const {
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index bf8e7d6..1fdc9ed 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -130,6 +130,16 @@
     const char* fileExtension() const SK_OVERRIDE { return "skp"; }
 };
 
+class SVGSink : public Sink {
+public:
+    SVGSink();
+
+    Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
+    int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
+    const char* fileExtension() const SK_OVERRIDE { return "svg"; }
+};
+
+
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 class ViaMatrix : public Sink {
diff --git a/gyp/dm.gypi b/gyp/dm.gypi
index 4bfda6f..9ace2ac 100644
--- a/gyp/dm.gypi
+++ b/gyp/dm.gypi
@@ -2,15 +2,16 @@
 {
   'include_dirs': [
     '../dm',
+    '../experimental/svg',
     '../gm',
-    '../tests',
-    '../src/images',
-    '../src/lazy',
     '../src/core',
     '../src/effects',
+    '../src/images',
+    '../src/lazy',
     '../src/pipe/utils/',
     '../src/utils',
     '../src/utils/debugger',
+    '../tests',
     '../tools',
   ],
   'dependencies': [
@@ -22,6 +23,7 @@
     'tools.gyp:proc_stats',
     'tools.gyp:sk_tool_utils',
     'tools.gyp:timer',
+    'xml.gyp:xml',
   ],
   'includes': [
     'gmslides.gypi',
@@ -34,6 +36,7 @@
     '../dm/DMJsonWriter.cpp',
     '../gm/gm.cpp',
 
+    '../experimental/svg/SkSVGDevice.cpp',
     '../src/pipe/utils/SamplePipeControllers.cpp',
     '../src/utils/debugger/SkDebugCanvas.cpp',
     '../src/utils/debugger/SkDrawCommand.cpp',