Fixing the ignore transform flag in Ganesh with mask filter and drawBitmap

TEST=SampleApp/Texture Domain
BUG=http://code.google.com/p/skia/issues/detail?id=335
REVIEW=http://codereview.appspot.com/4803052/



git-svn-id: http://skia.googlecode.com/svn/trunk@1987 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index d9b618a..4294e49 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1237,33 +1237,33 @@
     }
 
     if (paint.getMaskFilter()){
-        SkBitmap        tmp;    // storage if we need a subset of bitmap
+        // Convert the bitmap to a shader so that the rect can be drawn
+        // through drawRect, which supports mask filters.
+        SkBitmap        tmp;    // subset of bitmap, if necessary
         const SkBitmap* bitmapPtr = &bitmap;
         if (srcRectPtr) {
             if (!bitmap.extractSubset(&tmp, srcRect)) {
                 return;     // extraction failed
             }
             bitmapPtr = &tmp;
+            srcRect.set(0,0, srcRect.width(), srcRect.height());
         }
         SkPaint paintWithTexture(paint);
         paintWithTexture.setShader(SkShader::CreateBitmapShader( *bitmapPtr,
             SkShader::kClamp_TileMode, SkShader::kClamp_TileMode))->unref();
-        paintWithTexture.getShader()->setLocalMatrix(m);
-
         SkRect ScalarRect;
         ScalarRect.set(srcRect);
 
-        if (m.rectStaysRect()) {
-            // Preferred drawing method, optimized for rectangles
-            m.mapRect(&ScalarRect);
-            this->drawRect(draw, ScalarRect, paintWithTexture);
-        } else {
-            // Slower drawing method, for warped or rotated rectangles
-            SkPath path;
-            path.addRect(ScalarRect);
-            path.transform(m);
-            this->drawPath(draw, path, paintWithTexture, NULL, true);
-        }
+        // Transform 'm' needs to be concatenated to the draw matrix,
+        // rather than transforming the primitive directly, so that 'm' will 
+        // also affect the behavior of the mask filter.
+        SkMatrix drawMatrix;
+        drawMatrix.setConcat(*draw.fMatrix, m);
+        SkDraw transformedDraw(draw);
+        transformedDraw.fMatrix = &drawMatrix;
+
+        this->drawRect(transformedDraw, ScalarRect, paintWithTexture);
+
         return;
     }