gm: add a flag to force perspective usage in all gms

BUG=
R=reed@google.com, epoger@google.com, borenet@google.com

Author: edisonn@google.com

Review URL: https://chromiumcodereview.appspot.com/23587029

git-svn-id: http://skia.googlecode.com/svn/trunk@11487 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/gm.cpp b/gm/gm.cpp
index 4a8b3c3..966e59b 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -15,6 +15,7 @@
     fCanvasIsDeferred = false;
     fHaveCalledOnceBeforeDraw = false;
     fIgnoreFailures = false;
+    fStarterMatrix.reset();
 }
 GM::~GM() {}
 
diff --git a/gm/gm.h b/gm/gm.h
index 3a65160..bf1a411 100644
--- a/gm/gm.h
+++ b/gm/gm.h
@@ -74,7 +74,9 @@
         // Most GMs will return the identity matrix, but some PDFs tests
         // require setting the initial transform.
         SkMatrix getInitialTransform() const {
-            return this->onGetInitialTransform();
+            SkMatrix matrix = fStarterMatrix;
+            matrix.preConcat(this->onGetInitialTransform());
+            return matrix;
         }
 
         SkColor getBGColor() const { return fBGColor; }
@@ -106,6 +108,11 @@
         static GrContext* GetGr(/*very nearly const*/ SkCanvas*);
 #endif
 
+    const SkMatrix& getStarterMatrix() { return fStarterMatrix; }
+    void setStarterMatrix(const SkMatrix& matrix) {
+        fStarterMatrix = matrix;
+    }
+
     protected:
         static SkString gResourcePath;
 
@@ -123,6 +130,7 @@
         bool     fCanvasIsDeferred; // work-around problem in srcmode.cpp
         bool     fHaveCalledOnceBeforeDraw;
         bool     fIgnoreFailures; // whether to file any failures as failure-ignored
+        SkMatrix fStarterMatrix;
     };
 
     typedef SkTRegistry<GM*(*)(void*)> GMRegistry;
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 2cd8f47..84d4d3a 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -1423,6 +1423,14 @@
              "which can be in range 0-100). N = -1 will disable JPEG compression. "
              "Default is N = 100, maximum quality.");
 
+// TODO(edisonn): pass a matrix instead of forcePerspectiveMatrix
+// Either the 9 numbers defining the matrix
+// or probably more readable would be to replace it with a set of a few predicates
+// Like --prerotate 100 200 10 --posttranslate 10, 10
+// Probably define spacial names like centerx, centery, top, bottom, left, right
+// then we can write something reabable like --rotate centerx centery 90
+DEFINE_bool(forcePerspectiveMatrix, false, "Force a perspective matrix.");
+
 static bool encode_to_dct_stream(SkWStream* stream, const SkBitmap& bitmap, const SkIRect& rect) {
     // Filter output of warnings that JPEG is not available for the image.
     if (bitmap.width() >= 65500 || bitmap.height() >= 65500) return false;
@@ -2154,6 +2162,15 @@
     Iter iter;
     GM* gm;
     while ((gm = iter.next()) != NULL) {
+        if (FLAGS_forcePerspectiveMatrix) {
+            SkMatrix perspective;
+            perspective.setIdentity();
+            perspective.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000)));
+            perspective.setSkewX(SkScalarDiv(SkIntToScalar(8),
+                                 SkIntToScalar(25)));
+
+            gm->setStarterMatrix(perspective);
+        }        
         SkAutoTDelete<GM> adgm(gm);
         ++gmIndex;
         if (moduloRemainder >= 0) {