DM: add Via abstract class

BUG=skia:

Review URL: https://codereview.chromium.org/1117183007
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index 0d612d0..903755e 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -214,96 +214,68 @@
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
-class ViaMatrix : public Sink {
+class Via : public Sink {
+public:
+    explicit Via(Sink* sink) : fSink(sink) {}
+    const char* fileExtension() const override { return fSink->fileExtension(); }
+    int               enclave() const override { return fSink->enclave(); }
+protected:
+    SkAutoTDelete<Sink> fSink;
+};
+
+class ViaMatrix : public Via {
 public:
     ViaMatrix(SkMatrix, Sink*);
-
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
 private:
-    SkMatrix            fMatrix;
-    SkAutoTDelete<Sink> fSink;
+    const SkMatrix fMatrix;
 };
 
-class ViaUpright : public Sink {
+class ViaUpright : public Via {
 public:
     ViaUpright(SkMatrix, Sink*);
-
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
 private:
-    SkMatrix            fMatrix;
-    SkAutoTDelete<Sink> fSink;
+    const SkMatrix fMatrix;
 };
 
-class ViaPipe : public Sink {
+class ViaPipe : public Via {
 public:
-    explicit ViaPipe(Sink*);
-
+    explicit ViaPipe(Sink* sink) : Via(sink) {}
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
-private:
-    SkAutoTDelete<Sink>  fSink;
 };
 
-class ViaDeferred : public Sink {
+class ViaDeferred : public Via {
 public:
-    explicit ViaDeferred(Sink*);
-
+    explicit ViaDeferred(Sink* sink) : Via(sink) {}
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
-private:
-    SkAutoTDelete<Sink>  fSink;
 };
 
-class ViaSerialization : public Sink {
+class ViaSerialization : public Via {
 public:
-    explicit ViaSerialization(Sink*);
-
+    explicit ViaSerialization(Sink* sink) : Via(sink) {}
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
-private:
-    SkAutoTDelete<Sink> fSink;
 };
 
-class ViaTiles : public Sink {
+class ViaTiles : public Via {
 public:
     ViaTiles(int w, int h, SkBBHFactory*, Sink*);
-
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
 private:
     const int                   fW, fH;
     SkAutoTDelete<SkBBHFactory> fFactory;
-    SkAutoTDelete<Sink>         fSink;
 };
 
-class ViaSecondPicture : public Sink {
+class ViaSecondPicture : public Via {
 public:
-    explicit ViaSecondPicture(Sink*);
-
+    explicit ViaSecondPicture(Sink* sink) : Via(sink) {}
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
-private:
-    SkAutoTDelete<Sink>  fSink;
 };
 
-class ViaSingletonPictures : public Sink {
+class ViaSingletonPictures : public Via {
 public:
-    explicit ViaSingletonPictures(Sink*);
-
+    explicit ViaSingletonPictures(Sink* sink) : Via(sink) {}
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-    int enclave() const override { return fSink->enclave(); }
-    const char* fileExtension() const override { return fSink->fileExtension(); }
-private:
-    SkAutoTDelete<Sink>  fSink;
 };
 
 }  // namespace DM