Add transparent source bitmap to colormatrix GM.

R=robertphillips@google.com
Review URL: https://codereview.appspot.com/6727043

git-svn-id: http://skia.googlecode.com/svn/trunk@5969 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp
index af305ee..16086f0 100644
--- a/gm/colormatrix.cpp
+++ b/gm/colormatrix.cpp
@@ -7,6 +7,7 @@
 
 #include "gm.h"
 #include "SkColorMatrixFilter.h"
+#include "SkGradientShader.h"
 
 #define WIDTH 500
 #define HEIGHT 500
@@ -41,7 +42,8 @@
     SkOnce fOnce;
     void init() {
         if (fOnce.once()) {
-            fBitmap = createBitmap(64, 64);
+            fSolidBitmap = this->createSolidBitmap(64, 64);
+            fTransparentBitmap = this->createTransparentBitmap(64, 64);
         }
     }
 
@@ -59,7 +61,7 @@
         return make_isize(WIDTH, HEIGHT);
     }
 
-    SkBitmap createBitmap(int width, int height) {
+    SkBitmap createSolidBitmap(int width, int height) {
         SkBitmap bm;
         bm.setConfig(SkBitmap::kARGB_8888_Config, width, height);
         bm.allocPixels();
@@ -75,68 +77,95 @@
         }
         return bm;
     }
+
+    // creates a bitmap with shades of transparent gray.
+    SkBitmap createTransparentBitmap(int width, int height) {
+        SkBitmap bm;
+        bm.setConfig(SkBitmap::kARGB_8888_Config, width, height);
+        bm.allocPixels();
+        SkCanvas canvas(bm);
+        canvas.clear(0x0);
+
+        SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
+        SkColor colors[] = {0x00000000, 0xFFFFFFFF};
+        SkPaint paint;
+        paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2,
+                                                       SkShader::kClamp_TileMode))->unref();
+        canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
+        return bm;
+    }
+
     virtual void onDraw(SkCanvas* canvas) {
         this->init();
 
         SkPaint paint;
         SkColorMatrix matrix;
 
-        matrix.setIdentity();
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 0, 0, &paint);
+        paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+        const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap };
 
-        matrix.setRotate(SkColorMatrix::kR_Axis, 90);
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 80, 0, &paint);
+        for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
 
-        matrix.setRotate(SkColorMatrix::kG_Axis, 90);
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 160, 0, &paint);
+            matrix.setIdentity();
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 0, 0, &paint);
 
-        matrix.setRotate(SkColorMatrix::kB_Axis, 90);
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 240, 0, &paint);
+            matrix.setRotate(SkColorMatrix::kR_Axis, 90);
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 80, 0, &paint);
 
-        matrix.setSaturation(SkFloatToScalar(0.0f));
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 0, 80, &paint);
+            matrix.setRotate(SkColorMatrix::kG_Axis, 90);
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 160, 0, &paint);
 
-        matrix.setSaturation(SkFloatToScalar(0.5f));
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 80, 80, &paint);
+            matrix.setRotate(SkColorMatrix::kB_Axis, 90);
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 240, 0, &paint);
 
-        matrix.setSaturation(SkFloatToScalar(1.0f));
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 160, 80, &paint);
+            matrix.setSaturation(SkFloatToScalar(0.0f));
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 0, 80, &paint);
 
-        matrix.setSaturation(SkFloatToScalar(2.0f));
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 240, 80, &paint);
+            matrix.setSaturation(SkFloatToScalar(0.5f));
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 80, 80, &paint);
 
-        matrix.setRGB2YUV();
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 0, 160, &paint);
+            matrix.setSaturation(SkFloatToScalar(1.0f));
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 160, 80, &paint);
 
-        matrix.setYUV2RGB();
-        setColorMatrix(&paint, matrix);
-        canvas->drawBitmap(fBitmap, 80, 160, &paint);
+            matrix.setSaturation(SkFloatToScalar(2.0f));
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 240, 80, &paint);
 
-        SkScalar s1 = SK_Scalar1;
-        SkScalar s255 = SkIntToScalar(255);
-        // Move red into alpha, set color to white
-        SkScalar data[20] = {
-            0,  0, 0, 0, s255,
-            0,  0, 0, 0, s255,
-            0,  0, 0, 0, s255,
-            s1, 0, 0, 0, 0,
-        };
+            matrix.setRGB2YUV();
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 0, 160, &paint);
 
-        setArray(&paint, data);
-        canvas->drawBitmap(fBitmap, 160, 160, &paint);
+            matrix.setYUV2RGB();
+            setColorMatrix(&paint, matrix);
+            canvas->drawBitmap(bmps[i], 80, 160, &paint);
+
+            SkScalar s1 = SK_Scalar1;
+            SkScalar s255 = SkIntToScalar(255);
+            // Move red into alpha, set color to white
+            SkScalar data[20] = {
+                0,  0, 0, 0, s255,
+                0,  0, 0, 0, s255,
+                0,  0, 0, 0, s255,
+                s1, 0, 0, 0, 0,
+            };
+
+            setArray(&paint, data);
+            canvas->drawBitmap(bmps[i], 160, 160, &paint);
+
+            canvas->translate(0, 240);
+        }
     }
 
 private:
-    SkBitmap fBitmap;
+    SkBitmap fSolidBitmap;
+    SkBitmap fTransparentBitmap;
     typedef GM INHERITED;
 };