diff --git a/debugger/QT/SkCanvasWidget.cpp b/debugger/QT/SkCanvasWidget.cpp
index 2f714d7..63a0e05 100644
--- a/debugger/QT/SkCanvasWidget.cpp
+++ b/debugger/QT/SkCanvasWidget.cpp
@@ -29,8 +29,7 @@
     fHorizontalLayout.addWidget(&fGLWidget);
 
     fPreviousPoint.set(0,0);
-    fUserOffset.set(0,0);
-    fUserScaleFactor = 1.0;
+    fUserMatrix.reset();
 
     setWidgetVisibility(kGPU_WidgetType, true);
     connect(&fRasterWidget, SIGNAL(drawComplete()),
@@ -48,9 +47,10 @@
 
 void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
     SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
-    fUserOffset += eventPoint - fPreviousPoint;
+    SkIPoint eventOffset = eventPoint - fPreviousPoint;
     fPreviousPoint = eventPoint;
-    fDebugger->setUserOffset(fUserOffset);
+    fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
+    fDebugger->setUserMatrix(fUserMatrix);
     drawTo(fDebugger->index());
 }
 
@@ -61,15 +61,50 @@
 }
 
 void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
-    resetWidgetTransform();
+    Qt::KeyboardModifiers modifiers = event->modifiers();
+    if (modifiers.testFlag(Qt::ControlModifier)) {
+        snapWidgetTransform();
+    } else {
+        resetWidgetTransform();
+    }
+}
+
+#define ZOOM_FACTOR (1.25f)
+
+void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
+    Qt::KeyboardModifiers modifiers = event->modifiers();
+    if (modifiers.testFlag(Qt::ControlModifier)) {
+        zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
+    } else {
+        if (Qt::Horizontal == event->orientation()) {
+            fUserMatrix.postTranslate(event->delta(), 0.0f);
+        } else {
+            fUserMatrix.postTranslate(0.0f, event->delta());
+        }
+        fDebugger->setUserMatrix(fUserMatrix);
+        drawTo(fDebugger->index());
+    }
+}
+
+void SkCanvasWidget::zoom(int zoomCommand) {
+    zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
+         this->size().width() / 2, this->size().height() / 2);
+}
+
+void SkCanvasWidget::snapWidgetTransform() {
+    double x, y;
+    modf(fUserMatrix.getTranslateX(), &x);
+    modf(fUserMatrix.getTranslateY(), &y);
+    fUserMatrix[SkMatrix::kMTransX] = x;
+    fUserMatrix[SkMatrix::kMTransY] = y;
+    fDebugger->setUserMatrix(fUserMatrix);
+    drawTo(fDebugger->index());
 }
 
 void SkCanvasWidget::resetWidgetTransform() {
-    fUserOffset.set(0,0);
-    fUserScaleFactor = 1.0;
-    fDebugger->setUserOffset(fUserOffset);
-    fDebugger->setUserScale(fUserScaleFactor);
-    emit scaleFactorChanged(fUserScaleFactor);
+    fUserMatrix.reset();
+    fDebugger->setUserMatrix(fUserMatrix);
+    emit scaleFactorChanged(fUserMatrix.getScaleX());
     drawTo(fDebugger->index());
 }
 
@@ -81,17 +116,9 @@
     }
 }
 
-void SkCanvasWidget::zoom(float zoomIncrement) {
-    fUserScaleFactor += zoomIncrement;
-
-    /* The range of the fUserScaleFactor crosses over the range -1,0,1 frequently.
-    * Based on the code below, -1 and 1 both scale the image to it's original
-    * size we do the following to never have a registered wheel scroll
-    * not effect the fUserScaleFactor. */
-    if (fUserScaleFactor == 0) {
-        fUserScaleFactor = 2 * zoomIncrement;
-    }
-    emit scaleFactorChanged(fUserScaleFactor);
-    fDebugger->setUserScale(fUserScaleFactor);
+void SkCanvasWidget::zoom(float scale, int px, int py) {
+    fUserMatrix.postScale(scale, scale, px, py);
+    emit scaleFactorChanged(fUserMatrix.getScaleX());
+    fDebugger->setUserMatrix(fUserMatrix);
     drawTo(fDebugger->index());
 }
diff --git a/debugger/QT/SkCanvasWidget.h b/debugger/QT/SkCanvasWidget.h
index ab634f8..f6bc618 100644
--- a/debugger/QT/SkCanvasWidget.h
+++ b/debugger/QT/SkCanvasWidget.h
@@ -34,28 +34,34 @@
 
     void setWidgetVisibility(WidgetType type, bool isHidden);
 
-    void zoom(float zoomIncrement);
+    /** Zooms the canvas by scale with the transformation centered at the widget point (px, py). */
+    void zoom(float scale, int px, int py);
 
     void resetWidgetTransform();
 
+    enum ZoomCommandTypes {
+        kIn_ZoomCommand,
+        kOut_ZoomCommand,
+    };
+public slots:
+    /**
+     *  Zooms in or out (see ZoomCommandTypes) by the standard zoom factor
+     *  with the transformation centered in the middle of the widget.
+     */
+    void zoom(int zoomCommand);
+
 signals:
     void scaleFactorChanged(float newScaleFactor);
     void commandChanged(int newCommand);
     void hitChanged(int hit);
 
-private slots:
-    void keyZoom(int zoomIncrement) {
-        zoom(zoomIncrement);
-    }
-
 private:
     QHBoxLayout fHorizontalLayout;
     SkRasterWidget fRasterWidget;
     SkGLWidget fGLWidget;
     SkDebugger* fDebugger;
     SkIPoint fPreviousPoint;
-    SkIPoint fUserOffset;
-    float fUserScaleFactor;
+    SkMatrix fUserMatrix;
 
     void mouseMoveEvent(QMouseEvent* event);
 
@@ -63,9 +69,9 @@
 
     void mouseDoubleClickEvent(QMouseEvent* event);
 
-    void wheelEvent(QWheelEvent* event) {
-        zoom(event->delta()/120);
-    }
+    void wheelEvent(QWheelEvent* event);
+
+    void snapWidgetTransform();
 };
 
 
diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
index e445171..058cb5c 100644
--- a/debugger/QT/SkDebuggerGUI.cpp
+++ b/debugger/QT/SkDebuggerGUI.cpp
@@ -98,12 +98,12 @@
     connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs()));
     connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave()));
 
-    fMapper.setMapping(&fActionZoomIn, 1);
-    fMapper.setMapping(&fActionZoomOut, -1);
+    fMapper.setMapping(&fActionZoomIn, SkCanvasWidget::kIn_ZoomCommand);
+    fMapper.setMapping(&fActionZoomOut, SkCanvasWidget::kOut_ZoomCommand);
 
     connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map()));
     connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map()));
-    connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(keyZoom(int)));
+    connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(zoom(int)));
 
     fInspectorWidget.setDisabled(true);
     fMenuEdit.setDisabled(true);
@@ -144,10 +144,10 @@
                            const SkTDArray<size_t>& offsets,
                            const SkTDArray<bool>& deletedCommands)
         : INHERITED(stream, info, isValid, decoder)
-        , fTot(0.0)
-        , fCurCommand(0)
         , fOffsets(offsets)
-        , fSkipCommands(deletedCommands) {
+        , fSkipCommands(deletedCommands)
+        , fTot(0.0)
+        , fCurCommand(0) {
         fTimes.setCount(fOffsets.count());
         fTypeTimes.setCount(LAST_DRAWTYPE_ENUM+1);
         this->resetTimes();
diff --git a/debugger/QT/SkSettingsWidget.cpp b/debugger/QT/SkSettingsWidget.cpp
index d9268be..c74be40 100644
--- a/debugger/QT/SkSettingsWidget.cpp
+++ b/debugger/QT/SkSettingsWidget.cpp
@@ -151,12 +151,6 @@
     return &fVisibleOn;
 }
 
-void SkSettingsWidget::setZoomText(int scaleFactor) {
-    if(scaleFactor == 1 || scaleFactor == -1) {
-        fZoomBox.setText("100%");
-    } else if (scaleFactor > 1) {
-        fZoomBox.setText(QString::number(scaleFactor*100).append("%"));
-    } else if (scaleFactor < -1) {
-        fZoomBox.setText(QString::number(100 / pow(2.0f, (-scaleFactor - 1))).append("%"));
-    }
+void SkSettingsWidget::setZoomText(float scale) {
+    fZoomBox.setText(QString::number(scale*100, 'f', 0).append("%"));
 }
diff --git a/debugger/QT/SkSettingsWidget.h b/debugger/QT/SkSettingsWidget.h
index fdb99d1..1f75527 100644
--- a/debugger/QT/SkSettingsWidget.h
+++ b/debugger/QT/SkSettingsWidget.h
@@ -34,7 +34,8 @@
      */
     SkSettingsWidget();
 
-    void setZoomText(int scaleFactor);
+    /** Sets the displayed user zoom level. A scale of 1.0 represents no zoom. */
+    void setZoomText(float scale);
 
     QRadioButton* getVisibilityButton();
 
diff --git a/debugger/SkDebugCanvas.cpp b/debugger/SkDebugCanvas.cpp
index 5fcc076..e4cfec8 100644
--- a/debugger/SkDebugCanvas.cpp
+++ b/debugger/SkDebugCanvas.cpp
@@ -39,8 +39,7 @@
     fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight);
     fFilter = false;
     fIndex = 0;
-    fUserOffset.set(0,0);
-    fUserScale = 1.0;
+    fUserMatrix.reset();
 }
 
 SkDebugCanvas::~SkDebugCanvas() {
@@ -63,13 +62,7 @@
 }
 
 void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
-    canvas->translate(SkIntToScalar(fUserOffset.fX),
-                      SkIntToScalar(fUserOffset.fY));
-    if (fUserScale < 0) {
-        canvas->scale((1.0f / -fUserScale), (1.0f / -fUserScale));
-    } else if (fUserScale > 0) {
-        canvas->scale(fUserScale, fUserScale);
-    }
+    canvas->concat(fUserMatrix);
 }
 
 int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
diff --git a/debugger/SkDebugCanvas.h b/debugger/SkDebugCanvas.h
index a94663d..aafa802 100644
--- a/debugger/SkDebugCanvas.h
+++ b/debugger/SkDebugCanvas.h
@@ -110,12 +110,8 @@
         fHeight = height;
     }
 
-    void setUserOffset(SkIPoint offset) {
-        fUserOffset = offset;
-    }
-
-    void setUserScale(float scale) {
-        fUserScale = scale;
+    void setUserMatrix(SkMatrix matrix) {
+        fUserMatrix = matrix;
     }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -212,8 +208,7 @@
     SkBitmap fBm;
     bool fFilter;
     int fIndex;
-    SkIPoint fUserOffset;
-    float fUserScale;
+    SkMatrix fUserMatrix;
     SkMatrix fMatrix;
     SkIRect fClip;
 
diff --git a/debugger/SkDebugger.h b/debugger/SkDebugger.h
index a0a1682..0e3906e 100644
--- a/debugger/SkDebugger.h
+++ b/debugger/SkDebugger.h
@@ -66,13 +66,9 @@
         return fDebugCanvas->getSize();
     }
 
-    void setUserOffset(SkIPoint userOffset) {
+    void setUserMatrix(SkMatrix userMatrix) {
         // Should this live in debugger instead?
-        fDebugCanvas->setUserOffset(userOffset);
-    }
-
-    void setUserScale(float userScale) {
-        fDebugCanvas->setUserScale(userScale);
+        fDebugCanvas->setUserMatrix(userMatrix);
     }
 
     int getCommandAtPoint(int x, int y, int index) {
