dm is like gm, but faster and with fewer features.

This is sort of the near-minimal proof-of-concept skeleton.

  - It can run existing GMs.
  - It supports most configs (just not PDF).
  - --replay is the only "fancy" feature it currently supports

Hopefully you will be disturbed by its speed.

BUG=
R=epoger@google.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@11802 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/dm/DMCpuTask.cpp b/dm/DMCpuTask.cpp
new file mode 100644
index 0000000..5534ba4
--- /dev/null
+++ b/dm/DMCpuTask.cpp
@@ -0,0 +1,57 @@
+#include "DMCpuTask.h"
+#include "DMReplayTask.h"
+#include "DMUtil.h"
+#include "SkCommandLineFlags.h"
+
+DEFINE_bool(replay, false, "If true, run replay tests for each CpuTask.");
+// TODO(mtklein): add the other various options
+
+namespace DM {
+
+CpuTask::CpuTask(const char* name,
+                 Reporter* reporter,
+                 TaskRunner* taskRunner,
+                 const skiagm::ExpectationsSource& expectations,
+                 skiagm::GMRegistry::Factory gmFactory,
+                 SkBitmap::Config config)
+    : Task(reporter, taskRunner)
+    , fGMFactory(gmFactory)
+    , fGM(fGMFactory(NULL))
+    , fName(underJoin(fGM->shortName(), name))
+    , fExpectations(expectations.get(png(fName).c_str()))
+    , fConfig(config)
+    {}
+
+void CpuTask::draw() {
+    SkBitmap bitmap;
+    bitmap.setConfig(fConfig, fGM->width(), fGM->height());
+    bitmap.allocPixels();
+    bitmap.eraseColor(0x00000000);
+    SkCanvas canvas(bitmap);
+
+    canvas.concat(fGM->getInitialTransform());
+    fGM->draw(&canvas);
+    canvas.flush();
+
+    const skiagm::GmResultDigest digest(bitmap);
+    if (!meetsExpectations(fExpectations, digest)) {
+        this->fail();
+    }
+
+    if (FLAGS_replay) {
+        this->spawnChild(SkNEW_ARGS(ReplayTask,
+                                   ("replay", *this, fGMFactory(NULL), digest, fConfig)));
+    }
+}
+
+bool CpuTask::shouldSkip() const {
+    if (SkBitmap::kRGB_565_Config == fConfig && (fGM->getFlags() & skiagm::GM::kSkip565_Flag)) {
+        return true;
+    }
+    if (fGM->getFlags() & skiagm::GM::kGPUOnly_Flag) {
+        return true;
+    }
+    return false;
+}
+
+}  // namespace DM