Create a skeleton VisualDebugModule

BUG=skia:

Review URL: https://codereview.chromium.org/1498043002
diff --git a/tools/VisualBench/VisualDebugModule.cpp b/tools/VisualBench/VisualDebugModule.cpp
new file mode 100644
index 0000000..e4e70dd
--- /dev/null
+++ b/tools/VisualBench/VisualDebugModule.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "VisualDebugModule.h"
+
+#include "SkCanvas.h"
+
+VisualDebugModule::VisualDebugModule(VisualBench* owner)
+    : fState(kInit_State)
+    , fIndex(0)
+    , fOwner(owner) {
+    // VisualDebugModule only really makes sense for SKPs
+    fBenchmarkStream.reset(new VisualBenchmarkStream(owner->getSurfaceProps(), true));
+}
+
+bool VisualDebugModule::advanceIfNecessary(SkCanvas* canvas) {
+    Benchmark* benchmark = fBenchmarkStream->current();
+    switch (fState) {
+        case kInit_State: {
+            // setup new benchmark
+            benchmark->delayedSetup();
+            fOwner->clear(canvas, SK_ColorWHITE, 3);
+            benchmark->preTimingHooks(canvas);
+
+            // reset debug canvas
+            SkIPoint size = benchmark->getSize();
+            fDebugCanvas.reset(new SkDebugCanvas(size.fX, size.fY));
+
+            // pour benchmark into canvas
+            benchmark->draw(1, fDebugCanvas);
+            fIndex = fDebugCanvas->getSize() - 1;
+            fState = kPlay_State;
+            break;
+        }
+        case kPlay_State: break;
+        case kNext_State:
+            // cleanup after the last SKP
+            benchmark->postTimingHooks(canvas);
+            fOwner->reset();
+            if (!fBenchmarkStream->next()) {
+                SkDebugf("Exiting VisualBench successfully\n");
+                fOwner->closeWindow();
+                return false;
+            }
+            fState = kInit_State;
+            break;
+    }
+    return true;
+}
+
+void VisualDebugModule::draw(SkCanvas* canvas) {
+    if (!fBenchmarkStream->current() || !this->advanceIfNecessary(canvas)) {
+        return;
+    }
+
+    fDebugCanvas->drawTo(canvas, fIndex);
+    canvas->flush();
+    fOwner->present();
+}
+
+bool VisualDebugModule::onHandleChar(SkUnichar c) {
+    switch (c) {
+        case ' ': fState = kNext_State; break;
+        case 'a': fIndex = (fIndex + 1) % (fDebugCanvas->getSize() - 1); break;
+        case 's': fIndex = fIndex <= 0 ? fDebugCanvas->getSize() - 1 : fIndex - 1; break;
+        default: break;
+    }
+
+    return true;
+}