split SkPictureRecorder out of SkPicture

https://codereview.chromium.org/214953003/



git-svn-id: http://skia.googlecode.com/svn/trunk@14171 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index ea15524..ab45555 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -122,19 +122,19 @@
     SkSize      fTileSize;
 
     SkPicture* LoadPicture(const char path[], BBoxType bbox) {
-        SkPicture* pic = NULL;
+        SkAutoTUnref<SkPicture> pic;
 
         SkBitmap bm;
         if (SkImageDecoder::DecodeFile(path, &bm)) {
             bm.setImmutable();
-            pic = SkNEW(SkPicture);
-            SkCanvas* can = pic->beginRecording(bm.width(), bm.height());
+            SkPictureRecorder recorder;
+            SkCanvas* can = recorder.beginRecording(bm.width(), bm.height());
             can->drawBitmap(bm, 0, 0, NULL);
-            pic->endRecording();
+            pic.reset(recorder.endRecording());
         } else {
             SkFILEStream stream(path);
             if (stream.isValid()) {
-                pic = SkPicture::CreateFromStream(&stream);
+                pic.reset(SkPicture::CreateFromStream(&stream));
             } else {
                 SkDebugf("coun't load picture at \"path\"\n", path);
             }
@@ -145,32 +145,30 @@
                 surf->unref();
             }
             if (false) { // re-record
-                SkPicture p2;
-                pic->draw(p2.beginRecording(pic->width(), pic->height()));
-                p2.endRecording();
+                SkPictureRecorder recorder;
+                pic->draw(recorder.beginRecording(pic->width(), pic->height()));
+                SkAutoTUnref<SkPicture> p2(recorder.endRecording());
 
                 SkString path2(path);
                 path2.append(".new.skp");
                 SkFILEWStream writer(path2.c_str());
-                p2.serialize(&writer);
+                p2->serialize(&writer);
             }
         }
 
-        if (!pic) {
+        if (NULL == pic) {
             return NULL;
         }
 
-        SkPicture* bboxPicture = NULL;
+        SkAutoTUnref<SkPictureFactory> factory;
         switch (bbox) {
         case kNo_BBoxType:
             // no bbox playback necessary
-            break;
+            return pic.detach();
         case kRTree_BBoxType:
-            bboxPicture = SkNEW(SkPicture);
             break;
         case kQuadTree_BBoxType:
-            bboxPicture = SkNEW_ARGS(SkQuadTreePicture,
-                (SkIRect::MakeWH(pic->width(), pic->height())));
+            factory.reset(SkNEW(SkQuadTreePictureFactory));
             break;
         case kTileGrid_BBoxType: {
             SkASSERT(!fTileSize.isEmpty());
@@ -178,21 +176,17 @@
             gridInfo.fMargin = SkISize::Make(0, 0);
             gridInfo.fOffset = SkIPoint::Make(0, 0);
             gridInfo.fTileInterval = fTileSize.toRound();
-            bboxPicture = SkNEW_ARGS(SkTileGridPicture, (pic->width(), pic->height(), gridInfo));
-        } break;
+            factory.reset(SkNEW_ARGS(SkTileGridPictureFactory, (gridInfo)));
+            break;
+        }
         default:
             SkASSERT(false);
         }
 
-        if (bboxPicture) {
-            pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(),
-                      SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
-            bboxPicture->endRecording();
-            SkDELETE(pic);
-            return bboxPicture;
-        }
-
-        return pic;
+        SkPictureRecorder recorder(factory);
+        pic->draw(recorder.beginRecording(pic->width(), pic->height(),
+                                          SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
+        return recorder.endRecording();
     }
 
     typedef SampleView INHERITED;