Add --matrix to DM, to play around with and maybe use on a bot.

BUG=skia:
R=reed@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/563723005
diff --git a/dm/DMCpuGMTask.cpp b/dm/DMCpuGMTask.cpp
index 63a3c42..c3c4ae1 100644
--- a/dm/DMCpuGMTask.cpp
+++ b/dm/DMCpuGMTask.cpp
@@ -24,6 +24,7 @@
     AllocatePixels(fColorType, fGM->getISize().width(), fGM->getISize().height(), &bm);
 
     SkCanvas canvas(bm);
+    CanvasPreflight(&canvas);
     canvas.concat(fGM->getInitialTransform());
     fGM->draw(&canvas);
     canvas.flush();
diff --git a/dm/DMGpuGMTask.cpp b/dm/DMGpuGMTask.cpp
index 3178fd6..65d65d9 100644
--- a/dm/DMGpuGMTask.cpp
+++ b/dm/DMGpuGMTask.cpp
@@ -1,5 +1,4 @@
 #include "DMGpuGMTask.h"
-
 #include "DMUtil.h"
 #include "DMWriteTask.h"
 #include "SkCommandLineFlags.h"
@@ -35,6 +34,7 @@
         return;
     }
     SkCanvas* canvas = surface->getCanvas();
+    CanvasPreflight(canvas);
 
     canvas->concat(fGM->getInitialTransform());
     fGM->draw(canvas);
diff --git a/dm/DMPDFTask.cpp b/dm/DMPDFTask.cpp
index c996aae..3102478 100644
--- a/dm/DMPDFTask.cpp
+++ b/dm/DMPDFTask.cpp
@@ -71,12 +71,14 @@
     if (fGM.get()) {
         rasterize = 0 == (fGM->getFlags() & skiagm::GM::kSkipPDFRasterization_Flag);
         SinglePagePDF pdf(fGM->width(), fGM->height());
+        CanvasPreflight(pdf.canvas());
         //TODO(mtklein): GM doesn't do this.  Why not?
         //pdf.canvas()->concat(fGM->getInitialTransform());
         fGM->draw(pdf.canvas());
         pdfData.reset(pdf.end());
     } else {
         SinglePagePDF pdf(fPicture->cullRect().width(), fPicture->cullRect().height());
+        CanvasPreflight(pdf.canvas());
         fPicture->playback(pdf.canvas());
         pdfData.reset(pdf.end());
     }
diff --git a/dm/DMPipeTask.cpp b/dm/DMPipeTask.cpp
index c7c64bd..9f54560 100644
--- a/dm/DMPipeTask.cpp
+++ b/dm/DMPipeTask.cpp
@@ -55,6 +55,7 @@
                                                  fFlags,
                                                  bitmap.width(),
                                                  bitmap.height());
+    CanvasPreflight(pipeCanvas);
     pipeCanvas->concat(fGM->getInitialTransform());
     fGM->draw(pipeCanvas);
     writer.endRecording();
diff --git a/dm/DMUtil.cpp b/dm/DMUtil.cpp
index 19b1c0f..a702bbe 100644
--- a/dm/DMUtil.cpp
+++ b/dm/DMUtil.cpp
@@ -1,11 +1,25 @@
 #include "DMUtil.h"
 
 #include "SkColorPriv.h"
+#include "SkCommandLineFlags.h"
 #include "SkPicture.h"
 #include "SkPictureRecorder.h"
 
+DEFINE_string(matrix, "1 0 0 0 1 0 0 0 1",
+              "Matrix to apply to the canvas before drawing.");
+
 namespace DM {
 
+void CanvasPreflight(SkCanvas* canvas) {
+    if (FLAGS_matrix.count() == 9) {
+        SkMatrix m;
+        for (int i = 0; i < 9; i++) {
+            m[i] = (SkScalar)atof(FLAGS_matrix[i]);
+        }
+        canvas->concat(m);
+    }
+}
+
 SkString UnderJoin(const char* a, const char* b) {
     SkString s;
     s.appendf("%s_%s", a, b);
@@ -27,6 +41,7 @@
 
     SkCanvas* canvas = skr ? recorder.EXPERIMENTAL_beginRecording(w, h, factory)
                            : recorder.  DEPRECATED_beginRecording(w, h, factory);
+    CanvasPreflight(canvas);
     canvas->concat(gm->getInitialTransform());
     gm->draw(canvas);
     canvas->flush();
diff --git a/dm/DMUtil.h b/dm/DMUtil.h
index fa29c76..49da857 100644
--- a/dm/DMUtil.h
+++ b/dm/DMUtil.h
@@ -2,6 +2,7 @@
 #define DMUtil_DEFINED
 
 #include "SkBitmap.h"
+#include "SkCanvas.h"
 #include "SkString.h"
 #include "gm.h"
 
@@ -36,6 +37,9 @@
 // Are these identical bitmaps?
 bool BitmapsEqual(const SkBitmap& a, const SkBitmap& b);
 
+// Hook to modify canvas using global flag values (e.g. --matrix).
+void CanvasPreflight(SkCanvas*);
+
 }  // namespace DM
 
 #endif  // DMUtil_DEFINED