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/bench/DeferredCanvasBench.cpp b/bench/DeferredCanvasBench.cpp
index 98a1e60..5ef64db 100644
--- a/bench/DeferredCanvasBench.cpp
+++ b/bench/DeferredCanvasBench.cpp
@@ -29,8 +29,12 @@
         SkDevice *device = canvas->getDevice()->createCompatibleDevice(
             SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false);
 
-        SkDeferredCanvas deferredCanvas(device);
-
+        SkAutoTUnref<SkDeferredCanvas> deferredCanvas(
+#if SK_DEFERRED_CANVAS_USES_FACTORIES
+            SkDeferredCanvas::Create(device));
+#else
+            SkNEW_ARGS(SkDeferredCanvas, (device)));
+#endif
         device->unref();
 
         initDeferredCanvas(deferredCanvas);
@@ -40,12 +44,12 @@
         }
 
         finalizeDeferredCanvas(deferredCanvas);
-        deferredCanvas.flush();
+        deferredCanvas->flush();
     }
 
-    virtual void initDeferredCanvas(SkDeferredCanvas& canvas) = 0;
-    virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) = 0;
-    virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) = 0;
+    virtual void initDeferredCanvas(SkDeferredCanvas* canvas) = 0;
+    virtual void drawInDeferredCanvas(SkDeferredCanvas* canvas) = 0;
+    virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) = 0;
 
     SkString fName;
 
@@ -81,25 +85,25 @@
     };
 protected:
 
-    virtual void initDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE {
-        canvas.setNotificationClient(&fNotificationClient);
+    virtual void initDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
+        canvas->setNotificationClient(&fNotificationClient);
     }
 
-    virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE {
+    virtual void drawInDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
         SkRect rect;
         rect.setXYWH(0, 0, 10, 10);
         SkPaint paint;
         for (int i = 0; i < M; i++) {
-            canvas.save(SkCanvas::kMatrixClip_SaveFlag);
-            canvas.translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT));
-            canvas.drawRect(rect, paint);
-            canvas.restore();
+            canvas->save(SkCanvas::kMatrixClip_SaveFlag);
+            canvas->translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT));
+            canvas->drawRect(rect, paint);
+            canvas->restore();
         }
     }
 
-    virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE {
-        canvas.clear(0x0);
-        canvas.setNotificationClient(NULL);
+    virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
+        canvas->clear(0x0);
+        canvas->setNotificationClient(NULL);
     }
 
 private: