diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h
index d718637..8f7378f 100644
--- a/include/gpu/GrContext.h
+++ b/include/gpu/GrContext.h
@@ -662,6 +662,44 @@
         GrRenderTarget* fPrevTarget;
     };
 
+    /**
+     *  Save/restore the view-matrix in the context.
+     */
+    class AutoMatrix : GrNoncopyable {
+    public:
+        AutoMatrix() : fContext(NULL) {}
+        AutoMatrix(GrContext* ctx) : fContext(ctx) {
+            fMatrix = ctx->getMatrix();
+        }
+        AutoMatrix(GrContext* ctx, const GrMatrix& matrix) : fContext(ctx) {
+            fMatrix = ctx->getMatrix();
+            ctx->setMatrix(matrix);
+        }
+        void set(GrContext* ctx) {
+            if (NULL != fContext) {
+                fContext->setMatrix(fMatrix);
+            }
+            fMatrix = ctx->getMatrix();
+            fContext = ctx;
+        }
+        void set(GrContext* ctx, const GrMatrix& matrix) {
+            if (NULL != fContext) {
+                fContext->setMatrix(fMatrix);
+            }
+            fMatrix = ctx->getMatrix();
+            ctx->setMatrix(matrix);
+            fContext = ctx;
+        }
+        ~AutoMatrix() {
+            if (NULL != fContext) {
+                fContext->setMatrix(fMatrix);
+            }
+        }
+
+    private:
+        GrContext*  fContext;
+        GrMatrix    fMatrix;
+    };
 
     ///////////////////////////////////////////////////////////////////////////
     // Functions intended for internal use only.
@@ -782,45 +820,6 @@
 };
 
 /**
- *  Save/restore the view-matrix in the context.
- */
-class GrAutoMatrix : GrNoncopyable {
-public:
-    GrAutoMatrix() : fContext(NULL) {}
-    GrAutoMatrix(GrContext* ctx) : fContext(ctx) {
-        fMatrix = ctx->getMatrix();
-    }
-    GrAutoMatrix(GrContext* ctx, const GrMatrix& matrix) : fContext(ctx) {
-        fMatrix = ctx->getMatrix();
-        ctx->setMatrix(matrix);
-    }
-    void set(GrContext* ctx) {
-        if (NULL != fContext) {
-            fContext->setMatrix(fMatrix);
-        }
-        fMatrix = ctx->getMatrix();
-        fContext = ctx;
-    }
-    void set(GrContext* ctx, const GrMatrix& matrix) {
-        if (NULL != fContext) {
-            fContext->setMatrix(fMatrix);
-        }
-        fMatrix = ctx->getMatrix();
-        ctx->setMatrix(matrix);
-        fContext = ctx;
-    }
-    ~GrAutoMatrix() {
-        if (NULL != fContext) {
-            fContext->setMatrix(fMatrix);
-        }
-    }
-
-private:
-    GrContext*  fContext;
-    GrMatrix    fMatrix;
-};
-
-/**
  * Gets and locks a scratch texture from a descriptor using
  * either exact or approximate criteria. Unlocks texture in
  * the destructor.
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 6e92bf7..a1e4161 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -643,7 +643,7 @@
     GrMatrix inverse;
     SkTLazy<GrPaint> tmpPaint;
     const GrPaint* p = &paint;
-    GrAutoMatrix am;
+    AutoMatrix am;
 
     // We attempt to map r by the inverse matrix and draw that. mapRect will
     // map the four corners and bound them with a new rect. This will not
@@ -1824,7 +1824,7 @@
     GrRenderTarget* oldRenderTarget = this->getRenderTarget();
     GrClip oldClip = this->getClip();
     GrTexture* origTexture = srcTexture;
-    GrAutoMatrix avm(this, GrMatrix::I());
+    AutoMatrix avm(this, GrMatrix::I());
     SkIRect clearRect;
     int scaleFactorX, radiusX;
     int scaleFactorY, radiusY;
@@ -1949,7 +1949,7 @@
                                       SkISize radius) {
     ASSERT_OWNED_RESOURCE(srcTexture);
     GrRenderTarget* oldRenderTarget = this->getRenderTarget();
-    GrAutoMatrix avm(this, GrMatrix::I());
+    AutoMatrix avm(this, GrMatrix::I());
     GrClip oldClip = this->getClip();
 
     GrClip newClip(GrRect::MakeWH(SkIntToScalar(srcTexture->width()), 
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 4e009ee..c731999 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -822,7 +822,7 @@
     GrPaint tempPaint;
     tempPaint.reset();
 
-    GrAutoMatrix avm(context, GrMatrix::I());
+    GrContext::AutoMatrix avm(context, GrMatrix::I());
     tempPaint.fAntiAlias = grp->fAntiAlias;
     if (tempPaint.fAntiAlias) {
         // AA uses the "coverage" stages on GrDrawTarget. Coverage with a dst
@@ -929,7 +929,7 @@
     // used to compute inverse view, if necessary
     GrMatrix ivm = matrix;
 
-    GrAutoMatrix avm(context, GrMatrix::I());
+    GrContext::AutoMatrix avm(context, GrMatrix::I());
 
     GrTextureDesc desc;
     desc.fWidth = dstM.fBounds.width();
@@ -1435,7 +1435,7 @@
                         const GrRect& rect,
                         GrCustomStage* stage) {
     SkASSERT(srcTexture && srcTexture->getContext() == context);
-    GrAutoMatrix avm(context, GrMatrix::I());
+    GrContext::AutoMatrix avm(context, GrMatrix::I());
     GrContext::AutoRenderTarget art(context, dstTexture->asRenderTarget());
     GrClip oldClip = context->getClip();
 
@@ -1516,7 +1516,7 @@
         return;
     }
 
-    GrAutoMatrix avm(fContext, GrMatrix::I());
+    GrContext::AutoMatrix avm(fContext, GrMatrix::I());
 
     GrSamplerState* sampler = grPaint.textureSampler(kBitmapTextureIdx);
 
@@ -1582,7 +1582,7 @@
     int w = bm.width();
     int h = bm.height();
 
-    GrAutoMatrix avm(fContext, GrMatrix::I());
+    GrContext::AutoMatrix avm(fContext, GrMatrix::I());
 
     grPaint.textureSampler(kBitmapTextureIdx)->reset();
 
