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]);
+ }
+ }
+}
+