Report data from bench_pictures in the same fashion as bench.

Move SkBenchLogger into separate files and make bench_pictures use it.
Remove sk_tools::print_msg, since SkBenchLogger is now used instead.

Combine picture_benchmark with bench_pictures, since that is the
only project that uses it.

Refactor the aggregator for bench timer data into its own class and
make bench_pictures use it.

Consolidate the various virtual PictureBenchmark::run functions
into one for reuse.

BUG=https://code.google.com/p/skia/issues/detail?id=822

Review URL: https://codereview.appspot.com/6488086

git-svn-id: http://skia.googlecode.com/svn/trunk@5432 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp
index edbdce9..e7e4b1a 100644
--- a/tools/PictureRenderer.cpp
+++ b/tools/PictureRenderer.cpp
@@ -87,29 +87,13 @@
     if (this->isUsingGpuDevice()) {
         SkGLContext* glContext = fGrContextFactory.getGLContext(
             GrContextFactory::kNative_GLContextType);
-        SK_GL(*glContext, Finish());
-    }
-#endif
-}
-
-void PictureRenderer::finishDraw() {
-    SkASSERT(fCanvas.get() != NULL);
-    if (NULL == fCanvas.get()) {
-        return;
-    }
-
-    fCanvas->flush();
-
-#if SK_SUPPORT_GPU
-    if (this->isUsingGpuDevice()) {
-        SkGLContext* glContext = fGrContextFactory.getGLContext(
-            GrContextFactory::kNative_GLContextType);
 
         SkASSERT(glContext != NULL);
         if (NULL == glContext) {
             return;
         }
 
+        fGrContext->flush();
         SK_GL(*glContext, Finish());
     }
 #endif
@@ -131,7 +115,14 @@
     return SkImageEncoder::EncodeFile(path.c_str(), bitmap, SkImageEncoder::kPNG_Type, 100);
 }
 
-void PipePictureRenderer::render() {
+void RecordPictureRenderer::render(bool doExtraWorkToDrawToBaseCanvas) {
+    SkPicture replayer;
+    SkCanvas* recorder = replayer.beginRecording(fPicture->width(), fPicture->height());
+    fPicture->draw(recorder);
+    replayer.endRecording();
+}
+
+void PipePictureRenderer::render(bool doExtraWorkToDrawToBaseCanvas) {
     SkASSERT(fCanvas.get() != NULL);
     SkASSERT(fPicture != NULL);
     if (NULL == fCanvas.get() || NULL == fPicture) {
@@ -143,10 +134,10 @@
     SkCanvas* pipeCanvas = writer.startRecording(&pipeController);
     pipeCanvas->drawPicture(*fPicture);
     writer.endRecording();
-    this->finishDraw();
+    fCanvas->flush();
 }
 
-void SimplePictureRenderer::render() {
+void SimplePictureRenderer::render(bool doExtraWorkToDrawToBaseCanvas) {
     SkASSERT(fCanvas.get() != NULL);
     SkASSERT(fPicture != NULL);
     if (NULL == fCanvas.get() || NULL == fPicture) {
@@ -154,7 +145,7 @@
     }
 
     fCanvas->drawPicture(*fPicture);
-    this->finishDraw();
+    fCanvas->flush();
 }
 
 TiledPictureRenderer::TiledPictureRenderer()
@@ -189,7 +180,7 @@
     }
 }
 
-void TiledPictureRenderer::render() {
+void TiledPictureRenderer::render(bool doExtraWorkToDrawToBaseCanvas) {
     SkASSERT(fCanvas.get() != NULL);
     SkASSERT(fPicture != NULL);
     if (NULL == fCanvas.get() || NULL == fPicture) {
@@ -197,8 +188,9 @@
     }
 
     this->drawTiles();
-    this->copyTilesToCanvas();
-    this->finishDraw();
+    if (doExtraWorkToDrawToBaseCanvas) {
+        this->copyTilesToCanvas();
+    }
 }
 
 void TiledPictureRenderer::end() {
@@ -293,6 +285,7 @@
     SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024);
     TileData* tileData = static_cast<TileData*>(data);
     tileData->fController->playback(tileData->fCanvas);
+    tileData->fCanvas->flush();
 }
 
 TileData::TileData(SkCanvas* canvas, ThreadSafePipeController* controller)
@@ -314,6 +307,7 @@
     SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024);
     CloneData* cloneData = static_cast<CloneData*>(data);
     cloneData->fCanvas->drawPicture(*cloneData->fClone);
+    cloneData->fCanvas->flush();
 }
 
 CloneData::CloneData(SkCanvas* target, SkPicture* clone)
@@ -367,30 +361,11 @@
     } else {
         for (int i = 0; i < fTiles.count(); ++i) {
             fTiles[i]->drawPicture(*(fPicture));
+            fTiles[i]->flush();
         }
     }
 }
 
-void TiledPictureRenderer::finishDraw() {
-    for (int i = 0; i < fTiles.count(); ++i) {
-        fTiles[i]->flush();
-    }
-
-#if SK_SUPPORT_GPU
-    if (this->isUsingGpuDevice()) {
-        SkGLContext* glContext = fGrContextFactory.getGLContext(
-            GrContextFactory::kNative_GLContextType);
-
-        SkASSERT(glContext != NULL);
-        if (NULL == glContext) {
-            return;
-        }
-
-        SK_GL(*glContext, Finish());
-    }
-#endif
-}
-
 void TiledPictureRenderer::copyTilesToCanvas() {
     for (int i = 0; i < fTiles.count(); ++i) {
         // Since SkPicture performs a save and restore when being drawn to a
@@ -404,6 +379,16 @@
 
         fCanvas->drawBitmap(source, -tile_x_start, -tile_y_start);
     }
+    fCanvas->flush();
+}
+
+void PlaybackCreationRenderer::setup() {
+    SkCanvas* recorder = fReplayer.beginRecording(fPicture->width(), fPicture->height());
+    fPicture->draw(recorder);
+}
+
+void PlaybackCreationRenderer::render(bool doExtraWorkToDrawToBaseCanvas) {
+    fReplayer.endRecording();
 }
 
 }