Refactoring into a public facing facing SkDebugger class first pass.

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

git-svn-id: http://skia.googlecode.com/svn/trunk@4986 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/debugger/QT/SkCanvasWidget.cpp b/debugger/QT/SkCanvasWidget.cpp
index ee9e5da..2f714d7 100644
--- a/debugger/QT/SkCanvasWidget.cpp
+++ b/debugger/QT/SkCanvasWidget.cpp
@@ -9,9 +9,15 @@
 
 #include "SkCanvasWidget.h"
 
-SkCanvasWidget::SkCanvasWidget(QWidget* parent) : QWidget(parent)
+SkCanvasWidget::SkCanvasWidget(QWidget* parent,
+        SkDebugger* debugger) : QWidget(parent)
     , fHorizontalLayout(this)
+    , fRasterWidget(debugger)
+    , fGLWidget(debugger)
 {
+
+    fDebugger = debugger;
+
     fHorizontalLayout.setSpacing(6);
     fHorizontalLayout.setContentsMargins(0,0,0,0);
     fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
@@ -21,63 +27,37 @@
 
     fHorizontalLayout.addWidget(&fRasterWidget);
     fHorizontalLayout.addWidget(&fGLWidget);
-    fDebugCanvas = NULL;
 
-    fIndex = 0;
     fPreviousPoint.set(0,0);
     fUserOffset.set(0,0);
     fUserScaleFactor = 1.0;
 
     setWidgetVisibility(kGPU_WidgetType, true);
-    this->setDisabled(true);
     connect(&fRasterWidget, SIGNAL(drawComplete()),
             this->parentWidget(), SLOT(drawComplete()));
 }
 
-SkCanvasWidget::~SkCanvasWidget() {
-    delete fDebugCanvas;
-}
+SkCanvasWidget::~SkCanvasWidget() {}
 
 void SkCanvasWidget::drawTo(int index) {
-    fIndex = index;
-    if (!fRasterWidget.isHidden()) {
-        fRasterWidget.drawTo(index);
-    }
-    if (!fGLWidget.isHidden()) {
-        fGLWidget.drawTo(index);
-    }
-    emit commandChanged(fIndex);
-}
-
-void SkCanvasWidget::loadPicture(QString filename) {
-    this->setDisabled(false);
-    SkStream* stream = new SkFILEStream(filename.toAscii());
-    SkPicture* picture = new SkPicture(stream);
-
-    /* TODO(chudy): Implement function that doesn't require new
-     * instantiation of debug canvas. */
-    delete fDebugCanvas;
-    fDebugCanvas = new SkDebugCanvas(picture->width(), picture->height());
-
-    picture->draw(fDebugCanvas);
-    fIndex = fDebugCanvas->getSize() - 1;
-    fRasterWidget.setDebugCanvas(fDebugCanvas);
-    fGLWidget.setDebugCanvas(fDebugCanvas);
-    fDebugCanvas->setBounds(this->width(), this->height());
+    fDebugger->setIndex(index);
+    fRasterWidget.draw();
+    fGLWidget.draw();
+    emit commandChanged(fDebugger->index());
 }
 
 void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
     SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
     fUserOffset += eventPoint - fPreviousPoint;
     fPreviousPoint = eventPoint;
-    fDebugCanvas->setUserOffset(fUserOffset);
-    drawTo(fIndex);
+    fDebugger->setUserOffset(fUserOffset);
+    drawTo(fDebugger->index());
 }
 
 void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
     fPreviousPoint.set(event->globalX(), event->globalY());
-    emit hitChanged(fDebugCanvas->getCommandAtPoint(event->x(), event->y(),
-            fIndex));
+    emit hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
+            fDebugger->index()));
 }
 
 void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
@@ -87,10 +67,10 @@
 void SkCanvasWidget::resetWidgetTransform() {
     fUserOffset.set(0,0);
     fUserScaleFactor = 1.0;
-    fDebugCanvas->setUserOffset(fUserOffset);
-    fDebugCanvas->setUserScale(fUserScaleFactor);
+    fDebugger->setUserOffset(fUserOffset);
+    fDebugger->setUserScale(fUserScaleFactor);
     emit scaleFactorChanged(fUserScaleFactor);
-    drawTo(fIndex);
+    drawTo(fDebugger->index());
 }
 
 void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
@@ -112,6 +92,6 @@
         fUserScaleFactor = 2 * zoomIncrement;
     }
     emit scaleFactorChanged(fUserScaleFactor);
-    fDebugCanvas->setUserScale(fUserScaleFactor);
-    drawTo(fIndex);
+    fDebugger->setUserScale(fUserScaleFactor);
+    drawTo(fDebugger->index());
 }
diff --git a/debugger/QT/SkCanvasWidget.h b/debugger/QT/SkCanvasWidget.h
index 13e4b27..ff72c60 100644
--- a/debugger/QT/SkCanvasWidget.h
+++ b/debugger/QT/SkCanvasWidget.h
@@ -15,12 +15,13 @@
 #include "SkStream.h"
 #include "SkRasterWidget.h"
 #include "SkGLWidget.h"
+#include "SkDebugger.h"
 
 class SkCanvasWidget : public QWidget {
     Q_OBJECT
 
 public:
-    SkCanvasWidget(QWidget* parent);
+    SkCanvasWidget(QWidget* parent, SkDebugger* debugger);
 
     ~SkCanvasWidget();
 
@@ -29,77 +30,10 @@
         kGPU_WidgetType         = 1 << 1,
     };
 
-    /**
-        Returns the visibility of the command at the specified index.
-        @param index  The index of the draw command
-     */
-    bool commandIsVisibleAtIndex(int index) {
-        return fDebugCanvas->getDrawCommandVisibilityAt(index);
-    }
-
-    /**
-        Toggles the visibility / execution of the draw command at index i with
-        the value of toggle.
-     */
-    void setCommandVisibliltyAtIndex(int index, bool toggle) {
-        fDebugCanvas->toggleCommand(index, toggle);
-    }
-
-    /**
-          Returns a vector of strings with all the current canvas draw
-          commands.
-     */
-    std::vector<std::string>* getDrawCommands() {
-        return fDebugCanvas->getDrawCommandsAsStrings();
-    }
-
-    SkDebugCanvas* getCurrentDebugCanvas() {
-        return fDebugCanvas;
-    }
-
     void drawTo(int index);
 
     void setWidgetVisibility(WidgetType type, bool isHidden);
 
-    /**
-        Toggles drawing filter on all drawing commands previous to current.
-     */
-    void toggleCurrentCommandFilter(bool toggle) {
-        fDebugCanvas->toggleFilter(toggle);
-    }
-
-    /**
-        TODO(chudy): Refactor into a struct of char**
-        Returns parameter information about the ith draw command.
-        @param: i  The index of the draw command we are accessing
-     */
-    std::vector<std::string>* getCurrentCommandInfo(int i) {
-        return fDebugCanvas->getCommandInfoAt(i);
-    }
-
-    const SkMatrix& getCurrentMatrix() {
-        return fDebugCanvas->getCurrentMatrix();
-    }
-
-    const SkIRect& getCurrentClip() {
-        return fDebugCanvas->getCurrentClip();
-    }
-
-    void loadPicture(QString filename);
-
-    // TODO(chudy): Not full proof since fRasterWidget isn't always drawn to.
-    int getBitmapHeight() {
-        return fRasterWidget.getBitmapHeight();
-    }
-
-    int getBitmapWidth() {
-        return fRasterWidget.getBitmapWidth();
-    }
-
-    SkRasterWidget* getRasterWidget() {
-        return &fRasterWidget;
-    }
-
     void zoom(float zoomIncrement);
 
 signals:
@@ -116,11 +50,10 @@
     QHBoxLayout fHorizontalLayout;
     SkRasterWidget fRasterWidget;
     SkGLWidget fGLWidget;
-    SkDebugCanvas* fDebugCanvas;
+    SkDebugger* fDebugger;
     SkIPoint fPreviousPoint;
     SkIPoint fUserOffset;
     float fUserScaleFactor;
-    int fIndex;
 
     void resetWidgetTransform();
 
diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
index 24eeabd..9863cc0 100644
--- a/debugger/QT/SkDebuggerGUI.cpp
+++ b/debugger/QT/SkDebuggerGUI.cpp
@@ -38,7 +38,7 @@
     , fMapper(this)
     , fListWidget(&fCentralWidget)
     , fDirectoryWidget(&fCentralWidget)
-    , fCanvasWidget(this)
+    , fCanvasWidget(this, &fDebugger)
     , fMenuBar(this)
     , fMenuFile(this)
     , fMenuNavigate(this)
@@ -107,8 +107,8 @@
     fDeletesActivated = !fDeletesActivated;
     for (int row = 0; row < fListWidget.count(); row++) {
         QListWidgetItem *item = fListWidget.item(row);
-        bool isVisible = fCanvasWidget.commandIsVisibleAtIndex(row);
-        item->setHidden(isVisible && fDeletesActivated);
+        item->setHidden(fDebugger.isCommandVisible(row)
+                && fDeletesActivated);
     }
 }
 
@@ -131,7 +131,7 @@
     for (int row = 0; row < fListWidget.count(); row++) {
         QListWidgetItem* item = fListWidget.item(row);
         item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
-        fCanvasWidget.setCommandVisibliltyAtIndex(row, true);
+        fDebugger.setCommandVisible(row, true);
     }
     if (fPause) {
         fCanvasWidget.drawTo(fPausedRow);
@@ -141,7 +141,7 @@
 }
 
 void SkDebuggerGUI::actionCommandFilter() {
-    fCanvasWidget.toggleCurrentCommandFilter(
+    fDebugger.highlightCurrentCommand(
             fSettingsWidget.getVisibilityButton()->isChecked());
     fCanvasWidget.drawTo(fListWidget.currentRow());
 }
@@ -154,12 +154,12 @@
     int currentRow = fListWidget.currentRow();
     QListWidgetItem* item = fListWidget.currentItem();
 
-    if (fCanvasWidget.commandIsVisibleAtIndex(currentRow)) {
+    if (fDebugger.isCommandVisible(currentRow)) {
         item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/delete.png"));
-        fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, false);
+        fDebugger.setCommandVisible(currentRow, false);
     } else {
         item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
-        fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, true);
+        fDebugger.setCommandVisible(currentRow, true);
     }
 
     if (fPause) {
@@ -247,17 +247,13 @@
 }
 
 void SkDebuggerGUI::drawComplete() {
-    fInspectorWidget.setMatrix(fCanvasWidget.getCurrentMatrix());
-    fInspectorWidget.setClip(fCanvasWidget.getCurrentClip());
+    fInspectorWidget.setMatrix(fDebugger.getCurrentMatrix());
+    fInspectorWidget.setClip(fDebugger.getCurrentClip());
 }
 
 void SkDebuggerGUI::saveToFile(QString filename) {
     SkFILEWStream file(filename.toAscii());
-    SkPicture picture;
-    SkCanvas* canvas = picture.beginRecording(100,100);
-    fCanvasWidget.getCurrentDebugCanvas()->draw(canvas);
-    picture.endRecording();
-    picture.serialize(&file);
+    fDebugger.makePicture()->serialize(&file);
 }
 
 void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
@@ -284,14 +280,9 @@
 }
 
 void SkDebuggerGUI::pauseDrawing(bool isPaused) {
-    // Qt uses 0 for unchecked, 1 for partially enabled and 2 for checked.
-    if (isPaused) {
-        fPause = true;
-        fPausedRow = fListWidget.currentRow();
-    } else {
-        fPause = false;
-        fCanvasWidget.drawTo(fListWidget.currentRow());
-    }
+    fPause = isPaused;
+    fPausedRow = fListWidget.currentRow();
+    fCanvasWidget.drawTo(fPausedRow);
 }
 
 void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
@@ -302,7 +293,7 @@
             if (!fPause) {
                 fCanvasWidget.drawTo(currentRow);
             }
-            std::vector<std::string> *cuffInfo = fCanvasWidget.getCurrentCommandInfo(
+            std::vector<std::string> *cuffInfo = fDebugger.getCommandInfo(
                     currentRow);
 
             /* TODO(chudy): Add command type before parameters. Rename v
@@ -344,21 +335,13 @@
 }
 
 void SkDebuggerGUI::toggleDirectory() {
-    if (fDirectoryWidget.isHidden()) {
-        fDirectoryWidget.setHidden(false);
-    } else {
-        fDirectoryWidget.setHidden(true);
-    }
+    fDirectoryWidget.setHidden(!fDirectoryWidget.isHidden());
 }
 
 void SkDebuggerGUI::toggleFilter(QString string) {
     for (int row = 0; row < fListWidget.count(); row++) {
         QListWidgetItem *item = fListWidget.item(row);
-        if (item->text() == string) {
-            item->setHidden(false);
-        } else {
-            item->setHidden(true);
-        }
+        item->setHidden(item->text() != string);
     }
 }
 
@@ -587,12 +570,21 @@
 
 void SkDebuggerGUI::loadPicture(QString fileName) {
     fLoading = true;
-    fCanvasWidget.loadPicture(fileName);
-    std::vector<std::string> *cv = fCanvasWidget.getDrawCommands();
+    SkStream* stream = new SkFILEStream(fileName.toAscii());
+    SkPicture* picture = new SkPicture(stream);
+    fDebugger.loadPicture(picture);
+    SkSafeUnref(stream);
+    SkSafeUnref(picture);
+
+    std::vector<std::string> *cv = fDebugger.getDrawCommands();
+
     /* fDebugCanvas is reinitialized every load picture. Need it to retain value
-     * of the visibility filter. */
-    fCanvasWidget.toggleCurrentCommandFilter(
-            fSettingsWidget.getVisibilityButton()->isChecked());
+     * of the visibility filter.
+     * TODO(chudy): This should be deprecated since fDebugger is not
+     * recreated.
+     * */
+    fDebugger.highlightCurrentCommand(fSettingsWidget.getVisibilityButton()->isChecked());
+
     setupListWidget(cv);
     setupComboBox(cv);
     fInspectorWidget.setDisabled(false);
@@ -627,7 +619,7 @@
     }
 
     QString overview;
-    int counter;
+    int counter = 0;
     for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
             ++it) {
         overview.append((it->first).c_str());
@@ -644,12 +636,12 @@
     overview.insert(0, total);
 
     overview.append("<br/>");
-    overview.append("SkBitmap Width: ");
+    overview.append("SkPicture Width: ");
     // NOTE(chudy): This is where we can pull out the SkPictures width.
-    overview.append(QString::number(fCanvasWidget.getBitmapWidth()));
+    overview.append(QString::number(fDebugger.pictureWidth()));
     overview.append("px<br/>");
-    overview.append("SkBitmap Height: ");
-    overview.append(QString::number(fCanvasWidget.getBitmapHeight()));
+    overview.append("SkPicture Height: ");
+    overview.append(QString::number(fDebugger.pictureHeight()));
     overview.append("px");
     fInspectorWidget.setOverviewText(overview);
 
diff --git a/debugger/QT/SkDebuggerGUI.h b/debugger/QT/SkDebuggerGUI.h
index b1bbfa7..763f4be 100644
--- a/debugger/QT/SkDebuggerGUI.h
+++ b/debugger/QT/SkDebuggerGUI.h
@@ -12,7 +12,7 @@
 
 #include "SkCanvas.h"
 #include "SkCanvasWidget.h"
-#include "SkDebugCanvas.h"
+#include "SkDebugger.h"
 #include "SkGLWidget.h"
 #include "SkListWidget.h"
 #include "SkInspectorWidget.h"
@@ -238,6 +238,7 @@
     QListWidget fListWidget;
     QListWidget fDirectoryWidget;
 
+    SkDebugger fDebugger;
     SkCanvasWidget fCanvasWidget;
     SkInspectorWidget fInspectorWidget;
     SkSettingsWidget fSettingsWidget;
diff --git a/debugger/QT/SkGLWidget.cpp b/debugger/QT/SkGLWidget.cpp
index d3d5389..36abce0 100644
--- a/debugger/QT/SkGLWidget.cpp
+++ b/debugger/QT/SkGLWidget.cpp
@@ -9,12 +9,9 @@
 
 #include "SkGLWidget.h"
 
-SkGLWidget::SkGLWidget() : QGLWidget() {
+SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
     this->setStyleSheet("QWidget {background-color: white; border: 1px solid #cccccc;}");
-    fTransform.set(0,0);
-    fScaleFactor = 1.0;
-    fIndex = 0;
-    fDebugCanvas = NULL;
+    fDebugger = debugger;
     fCurIntf = NULL;
     fCurContext = NULL;
     fGpuDevice = NULL;
@@ -47,15 +44,18 @@
     SkSafeUnref(fCanvas);
     fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
     fCanvas = new SkCanvas(fGpuDevice);
-    drawTo(fIndex);
+    fDebugger->resize(w, h);
+    draw();
 }
 
 void SkGLWidget::paintGL() {
-    glClearColor(1, 1, 1, 0);
-    fDebugCanvas->drawTo(fCanvas, fIndex);
-    // TODO(chudy): Implement an optional flush button in Gui.
-    fCanvas->flush();
-    emit drawComplete();
+    if (!this->isHidden()) {
+        glClearColor(1, 1, 1, 0);
+        fDebugger->draw(fCanvas);
+        // TODO(chudy): Implement an optional flush button in Gui.
+        fCanvas->flush();
+        emit drawComplete();
+    }
 }
 
 GrPlatformRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
diff --git a/debugger/QT/SkGLWidget.h b/debugger/QT/SkGLWidget.h
index 5eeb1cb..e31d09c 100644
--- a/debugger/QT/SkGLWidget.h
+++ b/debugger/QT/SkGLWidget.h
@@ -12,6 +12,7 @@
 
 #include <QtOpenGL/QGLWidget>
 #include "SkDebugCanvas.h"
+#include "SkDebugger.h"
 #include "SkDevice.h"
 #include "SkGpuDevice.h"
 
@@ -24,29 +25,14 @@
 Q_OBJECT
 
 public:
-    SkGLWidget();
+    SkGLWidget(SkDebugger* debugger);
 
     ~SkGLWidget();
 
-    void setDebugCanvas(SkDebugCanvas* debugCanvas) {
-        fDebugCanvas = debugCanvas;
-        fIndex = debugCanvas->getSize() - 1;
+    void draw() {
         this->updateGL();
     }
 
-    void drawTo(int index) {
-        fIndex = index;
-        this->updateGL();
-    }
-
-    void setTranslate(SkIPoint translate) {
-        fTransform = translate;
-    }
-
-    void setScale(float scale) {
-        fScaleFactor = scale;
-    }
-
 signals:
     void drawComplete();
 
@@ -61,10 +47,7 @@
     GrContext* fCurContext;
     SkGpuDevice* fGpuDevice;
     SkCanvas* fCanvas;
-    SkDebugCanvas* fDebugCanvas;
-    int fIndex;
-    SkIPoint fTransform;
-    float fScaleFactor;
+    SkDebugger* fDebugger;
     GrPlatformRenderTargetDesc getDesc(int w, int h);
 };
 
diff --git a/debugger/QT/SkRasterWidget.cpp b/debugger/QT/SkRasterWidget.cpp
index ecb949c..4f8537d 100644
--- a/debugger/QT/SkRasterWidget.cpp
+++ b/debugger/QT/SkRasterWidget.cpp
@@ -9,15 +9,12 @@
 
 #include "SkRasterWidget.h"
 
-SkRasterWidget::SkRasterWidget() : QWidget() {
+SkRasterWidget::SkRasterWidget(SkDebugger *debugger) : QWidget() {
     fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 800, 800);
     fBitmap.allocPixels();
     fBitmap.eraseColor(0);
-    fTransform.set(0,0);
-    fScaleFactor = 1.0;
-    fIndex = 0;
     fDevice = new SkDevice(fBitmap);
-    fDebugCanvas = NULL;
+    fDebugger = debugger;
     fCanvas = new SkCanvas(fDevice);
     this->setStyleSheet("QWidget {background-color: white; border: 1px solid #cccccc;}");
 }
@@ -34,12 +31,13 @@
     SkSafeUnref(fDevice);
     fDevice = new SkDevice(fBitmap);
     fCanvas = new SkCanvas(fDevice);
+    fDebugger->resize(event->size().width(), event->size().height());
     this->update();
 }
 
 void SkRasterWidget::paintEvent(QPaintEvent* event) {
-    if (fDebugCanvas) {
-        fDebugCanvas->drawTo(fCanvas, fIndex);
+    if (!this->isHidden()) {
+        fDebugger->draw(fCanvas);
         QPainter painter(this);
         QStyleOption opt;
         opt.init(this);
diff --git a/debugger/QT/SkRasterWidget.h b/debugger/QT/SkRasterWidget.h
index b0ded02..a0355c1 100644
--- a/debugger/QT/SkRasterWidget.h
+++ b/debugger/QT/SkRasterWidget.h
@@ -11,7 +11,7 @@
 
 #include "SkGpuDevice.h"
 #include "SkDevice.h"
-#include "SkDebugCanvas.h"
+#include "SkDebugger.h"
 
 #include <QApplication>
 #include <QtGui>
@@ -21,37 +21,14 @@
     Q_OBJECT
 
 public:
-    SkRasterWidget();
+    SkRasterWidget(SkDebugger* debugger);
 
     ~SkRasterWidget();
 
-    void drawTo(int index) {
-        fIndex = index;
+    void draw() {
         this->update();
     }
 
-    void setDebugCanvas(SkDebugCanvas* debugCanvas) {
-        fDebugCanvas = debugCanvas;
-        fIndex = debugCanvas->getSize() - 1;
-        this->update();
-    }
-
-    int getBitmapHeight() {
-        return fBitmap.height();
-    }
-
-    int getBitmapWidth() {
-        return fBitmap.width();
-    }
-
-    void setTranslate(SkIPoint transform) {
-        fTransform = transform;
-    }
-
-    void setScale(float scale) {
-        fScaleFactor = scale;
-    }
-
 signals:
     void drawComplete();
 
@@ -62,13 +39,9 @@
 
 private:
     SkBitmap fBitmap;
-    SkDebugCanvas* fDebugCanvas;
+    SkDebugger* fDebugger;
     SkCanvas* fCanvas;
     SkDevice* fDevice;
-
-    int fIndex;
-    SkIPoint fTransform;
-    float fScaleFactor;
 };
 
 #endif /* SKRASTERWIDGET_H_ */
diff --git a/debugger/SkDebugCanvas.cpp b/debugger/SkDebugCanvas.cpp
index 6371f11..64444bb 100644
--- a/debugger/SkDebugCanvas.cpp
+++ b/debugger/SkDebugCanvas.cpp
@@ -124,7 +124,7 @@
     return commandVector[index];
 }
 
-std::vector<std::string>* SkDebugCanvas::getCommandInfoAt(int index) {
+std::vector<std::string>* SkDebugCanvas::getCommandInfo(int index) {
     SkASSERT(index < (int)commandVector.size());
     return commandVector[index]->Info();
 }
diff --git a/debugger/SkDebugCanvas.h b/debugger/SkDebugCanvas.h
index e02c34c..7a83390 100644
--- a/debugger/SkDebugCanvas.h
+++ b/debugger/SkDebugCanvas.h
@@ -73,7 +73,7 @@
         Returns information about the command at the given index.
         @param index  The index of the command
      */
-    std::vector<std::string>* getCommandInfoAt(int index);
+    std::vector<std::string>* getCommandInfo(int index);
 
     /**
         Returns the visibility of the command at the given index.
diff --git a/debugger/SkDebugger.cpp b/debugger/SkDebugger.cpp
index 86a4574..7934c73 100644
--- a/debugger/SkDebugger.cpp
+++ b/debugger/SkDebugger.cpp
@@ -6,12 +6,39 @@
  * found in the LICENSE file.
  */
 
-#include "SkDebuggerGUI.h"
-#include <QApplication>
+#include "SkDebugger.h"
 
-int main(int argc, char *argv[]) {
-    QApplication a(argc, argv);
-    SkDebuggerGUI w;
-    w.show();
-    return a.exec();
+SkDebugger::SkDebugger() {
+    // Create this some other dynamic way?
+    fDebugCanvas = new SkDebugCanvas(100, 100);
+    fPicture = NULL;
+    fPictureWidth = 0;
+    fPictureHeight = 0;
+    fIndex = 0;
+}
+
+SkDebugger::~SkDebugger() {
+    // Need to inherit from SkRef object in order for following to work
+    SkSafeUnref(fDebugCanvas);
+    SkSafeUnref(fPicture);
+}
+
+void SkDebugger::loadPicture(SkPicture* picture) {
+    fPictureWidth = picture->width();
+    fPictureHeight = picture->height();
+    delete fDebugCanvas;
+    fDebugCanvas = new SkDebugCanvas(fPictureWidth, fPictureHeight);
+    fDebugCanvas->setBounds(fPictureWidth, fPictureHeight);
+    picture->draw(fDebugCanvas);
+    fIndex = fDebugCanvas->getSize() - 1;
+    SkRefCnt_SafeAssign(fPicture, picture);
+}
+
+SkPicture* SkDebugger::makePicture() {
+    SkSafeUnref(fPicture);
+    fPicture = new SkPicture();
+    SkCanvas* canvas = fPicture->beginRecording(fPictureWidth, fPictureHeight);
+    fDebugCanvas->draw(canvas);
+    fPicture->endRecording();
+    return fPicture;
 }
diff --git a/debugger/SkDebugger.h b/debugger/SkDebugger.h
new file mode 100644
index 0000000..eb724f3
--- /dev/null
+++ b/debugger/SkDebugger.h
@@ -0,0 +1,112 @@
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#ifndef SKDEBUGGER_H_
+#define SKDEBUGGER_H_
+
+#include "SkDebugCanvas.h"
+#include "SkPicture.h"
+
+class SkDebugger {
+public:
+    SkDebugger();
+
+    ~SkDebugger();
+
+    void setIndex(int index) {
+        fIndex = index;
+    }
+    void draw(SkCanvas* canvas) {
+        if (fIndex > 0) {
+            fDebugCanvas->drawTo(canvas, fIndex);
+        }
+    }
+
+    void step();
+    void stepBack();
+    void play();
+    void rewind();
+
+    bool isCommandVisible(int index) {
+        return fDebugCanvas->getDrawCommandVisibilityAt(index);
+    }
+
+    void setCommandVisible(int index, bool isVisible) {
+        fDebugCanvas->toggleCommand(index, isVisible);
+    }
+
+    // TODO(chudy): Replace with SkTDArray
+    std::vector<std::string>* getDrawCommands() {
+        return fDebugCanvas->getDrawCommandsAsStrings();
+    }
+
+    void highlightCurrentCommand(bool on) {
+        fDebugCanvas->toggleFilter(on);
+    }
+
+    void resize(int width, int height) {
+        fDebugCanvas->setBounds(width, height);
+    }
+
+    void loadPicture(SkPicture* picture);
+
+    SkPicture* makePicture();
+
+    int getSize() {
+        return fDebugCanvas->getSize();
+    }
+
+    void setUserOffset(SkIPoint userOffset) {
+        // Should this live in debugger instead?
+        fDebugCanvas->setUserOffset(userOffset);
+    }
+
+    void setUserScale(float userScale) {
+        fDebugCanvas->setUserScale(userScale);
+    }
+
+    int getCommandAtPoint(int x, int y, int index) {
+        return fDebugCanvas->getCommandAtPoint(x, y, index);
+    }
+
+    std::vector<std::string>* getCommandInfo(int index) {
+        return fDebugCanvas->getCommandInfo(index);
+    }
+
+    const SkMatrix& getCurrentMatrix() {
+        return fDebugCanvas->getCurrentMatrix();
+    }
+
+    const SkIRect& getCurrentClip() {
+        return fDebugCanvas->getCurrentClip();
+    }
+
+    int pictureHeight() {
+        return fPictureHeight;
+    }
+
+    int pictureWidth() {
+        return fPictureWidth;
+    }
+
+    int index() {
+        return fIndex;
+    }
+
+private:
+    SkDebugCanvas* fDebugCanvas;
+    SkPicture* fPicture;
+
+    int fPictureWidth;
+    int fPictureHeight;
+    int fIndex;
+};
+
+
+#endif /* SKDEBUGGER_H_ */
diff --git a/debugger/debuggermain.cpp b/debugger/debuggermain.cpp
new file mode 100644
index 0000000..86a4574
--- /dev/null
+++ b/debugger/debuggermain.cpp
@@ -0,0 +1,17 @@
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkDebuggerGUI.h"
+#include <QApplication>
+
+int main(int argc, char *argv[]) {
+    QApplication a(argc, argv);
+    SkDebuggerGUI w;
+    w.show();
+    return a.exec();
+}
diff --git a/gyp/debugger.gyp b/gyp/debugger.gyp
index be3c793..8848832 100644
--- a/gyp/debugger.gyp
+++ b/gyp/debugger.gyp
@@ -10,6 +10,7 @@
         '../src/gpu', # To pull gl/GrGLUtil.h
       ],
       'sources': [
+          '../debugger/debuggermain.cpp',
         '../debugger/SkDebugCanvas.h',
         '../debugger/SkDebugCanvas.cpp',
         '../debugger/SkDebugger.cpp',