DM: add --serialize

Plus:
  - minor ReplayTask refactoring to share code with SerializeTask
  - move --replay to ReplayTask and --serialize to SerializeTask like WriteTask
  - when --writePath is given, write failures for Replay and Serialize tasks
  - function names have fewer blatant Skia style violations

BUG=
R=bsalomon@google.com

Author: mtklein@google.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@11890 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/dm/DMReplayTask.cpp b/dm/DMReplayTask.cpp
index 0d6780e..a0ecf5f 100644
--- a/dm/DMReplayTask.cpp
+++ b/dm/DMReplayTask.cpp
@@ -1,54 +1,38 @@
 #include "DMReplayTask.h"
+#include "DMWriteTask.h"
 #include "DMUtil.h"
 
+#include "SkCommandLineFlags.h"
 #include "SkPicture.h"
 
+DEFINE_bool(replay, false, "If true, run picture replay tests.");
+
 namespace DM {
 
-ReplayTask::ReplayTask(const char* suffix,
-                       const Task& parent,
+ReplayTask::ReplayTask(const Task& parent,
                        skiagm::GM* gm,
                        SkBitmap reference)
     : Task(parent)
-    , fName(underJoin(parent.name().c_str(), suffix))
+    , fName(UnderJoin(parent.name().c_str(), "replay"))
     , fGM(gm)
     , fReference(reference)
     {}
 
 void ReplayTask::draw() {
-    SkPicture picture;
-    SkCanvas* canvas = picture.beginRecording(SkScalarCeilToInt(fGM->width()),
-                                              SkScalarCeilToInt(fGM->height()),
-                                              0 /*flags*/);
-
-    canvas->concat(fGM->getInitialTransform());
-    fGM->draw(canvas);
-    canvas->flush();
-
-    picture.endRecording();
+    SkPicture recorded;
+    RecordPicture(fGM.get(), &recorded);
 
     SkBitmap bitmap;
-    bitmap.setConfig(fReference.config(),
-                     SkScalarCeilToInt(fGM->width()),
-                     SkScalarCeilToInt(fGM->height()));
-    bitmap.allocPixels();
-    bitmap.eraseColor(0x00000000);
-
-    SkCanvas replay(bitmap);
-    replay.drawPicture(picture);
-    replay.flush();
-
-    const SkAutoLockPixels mine(bitmap), theirs(fReference);
-    if (bitmap.getSize() != fReference.getSize() ||
-        0 != memcmp(bitmap.getPixels(), fReference.getPixels(), bitmap.getSize()))
-    {
+    SetupBitmap(fReference.config(), fGM.get(), &bitmap);
+    DrawPicture(&recorded, &bitmap);
+    if (!BitmapsEqual(bitmap, fReference)) {
         this->fail();
+        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
     }
 }
 
 bool ReplayTask::shouldSkip() const {
-    return fGM->getFlags() & skiagm::GM::kGPUOnly_Flag ||
-           fGM->getFlags() & skiagm::GM::kSkipPicture_Flag;
+    return !FLAGS_replay || fGM->getFlags() & skiagm::GM::kSkipPicture_Flag;
 }
 
 }  // namespace DM