Changing SkDeferredCanvas to use factories for creation

The objective of this change is to remove all calls to 
SkCanvas::setDevice. The factory API is hidden behind
a build flag in order to ease the roll into chromium.

A side-effect of the factory pattern is that it will
no longer be possible to allocate a SkDeferredCanvas on
the stack.  This changes nothing for chrome, but it
impacts skia test programs.

Review URL: https://codereview.chromium.org/16040002

git-svn-id: http://skia.googlecode.com/svn/trunk@9298 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/utils/SkDeferredCanvas.h b/include/utils/SkDeferredCanvas.h
index bef26c0..f961605 100644
--- a/include/utils/SkDeferredCanvas.h
+++ b/include/utils/SkDeferredCanvas.h
@@ -15,6 +15,11 @@
 class SkImage;
 class SkSurface;
 
+#if !defined(SK_DEFERRED_CANVAS_USES_FACTORIES)
+// This is temporary, for rolling the API change into Chromium/Blink
+#define SK_DEFERRED_CANVAS_USES_FACTORIES 0
+#endif
+
 /** \class SkDeferredCanvas
     Subclass of SkCanvas that encapsulates an SkPicture or SkGPipe for deferred
     drawing. The main difference between this class and SkPictureRecord (the
@@ -27,23 +32,39 @@
 public:
     class NotificationClient;
 
+    /** Construct a canvas with the specified surface to draw into.
+        This factory must be used for newImageSnapshot to work.
+        @param surface Specifies a surface for the canvas to draw into.
+     */
+    static SkDeferredCanvas* Create(SkSurface* surface);
+
+#ifdef SK_DEVELOPER
+    static SkDeferredCanvas* Create(SkDevice* device); // Used for testing
+#endif
+
+#if !SK_DEFERRED_CANVAS_USES_FACTORIES
+    /** DEPRECATED
+     */
     SkDeferredCanvas();
 
-    /** Construct a canvas with the specified device to draw into.
+    /** DEPRACATED, use create instead
+        Construct a canvas with the specified device to draw into.
         Equivalent to calling default constructor, then setDevice.
         @param device Specifies a device for the canvas to draw into.
     */
     explicit SkDeferredCanvas(SkDevice* device);
 
-    /** Construct a canvas with the specified surface to draw into.
+    /** DEPRECATED, use create instead
+        Construct a canvas with the specified surface to draw into.
         This constructor must be used for newImageSnapshot to work.
         @param surface Specifies a surface for the canvas to draw into.
     */
     explicit SkDeferredCanvas(SkSurface* surface);
+#endif
 
     virtual ~SkDeferredCanvas();
 
-    /**
+    /** DEPRECATED
      *  Specify a device to be used by this canvas. Calling setDevice will
      *  release the previously set device, if any. Takes a reference on the
      *  device.
@@ -254,6 +275,8 @@
     DeferredDevice* getDeferredDevice() const;
 
 private:
+    SkDeferredCanvas(DeferredDevice*);
+
     void recordedDrawCommand();
     SkCanvas* drawingCanvas() const;
     SkCanvas* immediateCanvas() const;