Enable SSAA on inverse filled paths

Review URL: http://codereview.appspot.com/4613044/



git-svn-id: http://skia.googlecode.com/svn/trunk@1584 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrDrawTarget.cpp b/gpu/src/GrDrawTarget.cpp
index 2848999..b5f9259 100644
--- a/gpu/src/GrDrawTarget.cpp
+++ b/gpu/src/GrDrawTarget.cpp
@@ -649,6 +649,7 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+
 GrDrawTarget::AutoStateRestore::AutoStateRestore() {
     fDrawTarget = NULL;
 }
@@ -677,3 +678,39 @@
         fDrawTarget = target;
     }
 }
+
+///////////////////////////////////////////////////////////////////////////////
+
+GrDrawTarget::AutoDeviceCoordDraw::AutoDeviceCoordDraw(GrDrawTarget* target, 
+                                                       int stageMask) {
+    GrAssert(NULL != target);
+
+    fDrawTarget = target;
+    fViewMatrix = target->getViewMatrix();
+    fStageMask = stageMask;
+    if (fStageMask) {
+        GrMatrix invVM;
+        if (fViewMatrix.invert(&invVM)) {
+            for (int s = 0; s < kNumStages; ++s) {
+                if (fStageMask & (1 << s)) {
+                    fSamplerMatrices[s] = target->getSamplerMatrix(s);
+                }
+            }
+            target->preConcatSamplerMatrices(fStageMask, invVM);
+        } else {
+            // sad trombone sound
+            fStageMask = 0;
+        }
+    }
+    target->setViewMatrix(GrMatrix::I());
+}
+
+GrDrawTarget::AutoDeviceCoordDraw::~AutoDeviceCoordDraw() {
+    fDrawTarget->setViewMatrix(fViewMatrix);
+    for (int s = 0; s < kNumStages; ++s) {
+        if (fStageMask & (1 << s)) {
+            fDrawTarget->setSamplerMatrix(s, fSamplerMatrices[s]);
+        }
+    }
+}
+