diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
index 600800f..d3c6fad 100644
--- a/debugger/QT/SkDebuggerGUI.cpp
+++ b/debugger/QT/SkDebuggerGUI.cpp
@@ -404,7 +404,7 @@
         item->setData(Qt::UserRole + 4, 100.0*temp);
     }
 
-    setupOverviewText(picture.typeTimes(), picture.totTime(), kNumRepeats);
+    setupOverviewText(picture.typeTimes(), picture.totTime());
 }
 
 void SkDebuggerGUI::actionCancel() {
@@ -1032,7 +1032,7 @@
 
     setupListWidget(commands);
     setupComboBox(commands);
-    setupOverviewText(NULL, 0.0, 1);
+    setupOverviewText(NULL, 0.0);
     fInspectorWidget.setDisabled(false);
     fSettingsWidget.setDisabled(false);
     fMenuEdit.setDisabled(false);
@@ -1070,87 +1070,10 @@
     }
 }
 
-void SkDebuggerGUI::setupOverviewText(const SkTDArray<double>* typeTimes,
-                                      double totTime,
-                                      int numRuns) {
-
-    const SkTDArray<SkDrawCommand*>& commands = fDebugger.getDrawCommands();
-
-    SkTDArray<int> counts;
-    counts.setCount(LAST_DRAWTYPE_ENUM+1);
-    for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) {
-        counts[i] = 0;
-    }
-
-    for (int i = 0; i < commands.count(); i++) {
-        counts[commands[i]->getType()]++;
-    }
-
-    QString overview;
-    int total = 0;
-#ifdef SK_DEBUG
-    double totPercent = 0, tempSum = 0;
-#endif
-    for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) {
-        if (0 == counts[i]) {
-            // if there were no commands of this type then they should've consumed no time
-            SkASSERT(NULL == typeTimes || 0.0 == (*typeTimes)[i]);
-            continue;
-        }
-
-        overview.append(SkDrawCommand::GetCommandString((DrawType) i));
-        overview.append(": ");
-        overview.append(QString::number(counts[i]));
-        if (NULL != typeTimes) {
-            overview.append(" - ");
-            overview.append(QString::number((*typeTimes)[i]/(float)numRuns, 'f', 1));
-            overview.append("ms");
-            overview.append(" - ");
-            double percent = 100.0*(*typeTimes)[i]/totTime;
-            overview.append(QString::number(percent, 'f', 1));
-            overview.append("%");
-#ifdef SK_DEBUG
-            totPercent += percent;
-            tempSum += (*typeTimes)[i];
-#endif
-        }
-        overview.append("<br/>");
-        total += counts[i];
-    }
-#ifdef SK_DEBUG
-    if (NULL != typeTimes) {
-        SkASSERT(SkScalarNearlyEqual(totPercent, 100.0));
-        SkASSERT(SkScalarNearlyEqual(tempSum, totTime));
-    }
-#endif
-
-    if (totTime > 0.0) {
-        overview.append("Total Time: ");
-        overview.append(QString::number(totTime/(float)numRuns, 'f', 2));
-        overview.append("ms");
-#ifdef SK_DEBUG
-        overview.append(" ");
-        overview.append(QString::number(totPercent));
-        overview.append("% ");
-#endif
-        overview.append("<br/>");
-    }
-
-    QString totalStr;
-    totalStr.append("Total Draw Commands: ");
-    totalStr.append(QString::number(total));
-    totalStr.append("<br/>");
-    overview.insert(0, totalStr);
-
-    overview.append("<br/>");
-    overview.append("SkPicture Width: ");
-    // NOTE(chudy): This is where we can pull out the SkPictures width.
-    overview.append(QString::number(fDebugger.pictureWidth()));
-    overview.append("px<br/>");
-    overview.append("SkPicture Height: ");
-    overview.append(QString::number(fDebugger.pictureHeight()));
-    overview.append("px");
-    fInspectorWidget.setText(overview, SkInspectorWidget::kOverview_TabType);
+void SkDebuggerGUI::setupOverviewText(const SkTDArray<double>* typeTimes, double totTime) {
+    SkString overview;
+    fDebugger.getOverviewText(typeTimes, totTime, &overview);
+    fInspectorWidget.setText(overview.c_str(), SkInspectorWidget::kOverview_TabType);
 }
 
 void SkDebuggerGUI::setupComboBox(SkTArray<SkString>* command) {
diff --git a/debugger/SkDebugger.cpp b/debugger/SkDebugger.cpp
index caa361e..5ed1187 100644
--- a/debugger/SkDebugger.cpp
+++ b/debugger/SkDebugger.cpp
@@ -7,6 +7,8 @@
  */
 
 #include "SkDebugger.h"
+#include "SkString.h"
+
 
 SkDebugger::SkDebugger() {
     // Create this some other dynamic way?
@@ -43,3 +45,83 @@
     newPicture->endRecording();
     return newPicture;
 }
+
+void SkDebugger::getOverviewText(const SkTDArray<double>* typeTimes,
+                                 double totTime,
+                                 SkString* overview) {
+    const SkTDArray<SkDrawCommand*>& commands = this->getDrawCommands();
+
+    SkTDArray<int> counts;
+    counts.setCount(LAST_DRAWTYPE_ENUM+1);
+    for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) {
+        counts[i] = 0;
+    }
+
+    for (int i = 0; i < commands.count(); i++) {
+        counts[commands[i]->getType()]++;
+    }
+
+    overview->reset();
+    int total = 0;
+#ifdef SK_DEBUG
+    double totPercent = 0, tempSum = 0;
+#endif
+    for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) {
+        if (0 == counts[i]) {
+            // if there were no commands of this type then they should've consumed no time
+            SkASSERT(NULL == typeTimes || 0.0 == (*typeTimes)[i]);
+            continue;
+        }
+
+        overview->append(SkDrawCommand::GetCommandString((DrawType) i));
+        overview->append(": ");
+        overview->appendScalar(counts[i]);
+        if (NULL != typeTimes) {
+            overview->append(" - ");
+            overview->appendScalar((*typeTimes)[i]);
+            overview->append("ms");
+            overview->append(" - ");
+            double percent = 100.0*(*typeTimes)[i]/totTime;
+            overview->appendScalar(percent);
+            overview->append("%");
+#ifdef SK_DEBUG
+            totPercent += percent;
+            tempSum += (*typeTimes)[i];
+#endif
+        }
+        overview->append("<br/>");
+        total += counts[i];
+    }
+#ifdef SK_DEBUG
+    if (NULL != typeTimes) {
+        SkASSERT(SkScalarNearlyEqual(totPercent, 100.0));
+        SkASSERT(SkScalarNearlyEqual(tempSum, totTime));
+    }
+#endif
+
+    if (totTime > 0.0) {
+        overview->append("Total Time: ");
+        overview->appendScalar(totTime);
+        overview->append("ms");
+#ifdef SK_DEBUG
+        overview->append(" ");
+        overview->appendScalar(totPercent);
+        overview->append("% ");
+#endif
+        overview->append("<br/>");
+    }
+
+    SkString totalStr;
+    totalStr.append("Total Draw Commands: ");
+    totalStr.appendScalar(total);
+    totalStr.append("<br/>");
+    overview->insert(0, totalStr);
+
+    overview->append("<br/>");
+    overview->append("SkPicture Width: ");
+    overview->appendScalar(pictureWidth());
+    overview->append("px<br/>");
+    overview->append("SkPicture Height: ");
+    overview->appendScalar(pictureHeight());
+    overview->append("px");
+}
diff --git a/debugger/SkDebugger.h b/debugger/SkDebugger.h
index 6749ff7..a6ef786 100644
--- a/debugger/SkDebugger.h
+++ b/debugger/SkDebugger.h
@@ -14,6 +14,8 @@
 #include "SkPicture.h"
 #include "SkTArray.h"
 
+class SkString;
+
 class SkDebugger {
 public:
     SkDebugger();
@@ -105,6 +107,7 @@
         }
     }
 
+    void getOverviewText(const SkTDArray<double>* typeTimes, double totTime, SkString* overview);
 
 private:
     SkDebugCanvas* fDebugCanvas;
