use rasterpipeline if localmatrix is rotated or skewed for images

Bug: skia:
Change-Id: Ib269b5b9d79b055fe614aaacfd7e0d05d48f6085
Reviewed-on: https://skia-review.googlesource.com/33180
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Yuqian Li <liyuqian@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 80751be..60412a0 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -62,7 +62,8 @@
 }
 
 bool SkImageShader::IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType ct, SkAlphaType at,
-                                         SkShader::TileMode tx, SkShader::TileMode ty) {
+                                         SkShader::TileMode tx, SkShader::TileMode ty,
+                                         const SkMatrix& localM) {
     if (ct != kN32_SkColorType) {
         return true;
     }
@@ -77,13 +78,18 @@
     if (!ctm.isScaleTranslate()) {
         return true;
     }
+#ifndef SK_SUPPORT_LEGACY_LOCAL_ROTATE_SHADER
+    if (!localM.isScaleTranslate()) {
+        return true;
+    }
+#endif
     return false;
 }
 
 bool SkImageShader::onIsRasterPipelineOnly(const SkMatrix& ctm) const {
     SkBitmapProvider provider(fImage.get(), nullptr);
     return IsRasterPipelineOnly(ctm, provider.info().colorType(), provider.info().alphaType(),
-                                fTileModeX, fTileModeY);
+                                fTileModeX, fTileModeY, this->getLocalMatrix());
 }
 
 SkShaderBase::Context* SkImageShader::onMakeContext(const ContextRec& rec,
diff --git a/src/shaders/SkImageShader.h b/src/shaders/SkImageShader.h
index 8e592e5..98856c9 100644
--- a/src/shaders/SkImageShader.h
+++ b/src/shaders/SkImageShader.h
@@ -30,7 +30,8 @@
     SkImageShader(sk_sp<SkImage>, TileMode tx, TileMode ty, const SkMatrix* localMatrix);
 
     static bool IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType, SkAlphaType,
-                                     SkShader::TileMode tx, SkShader::TileMode ty);
+                                     SkShader::TileMode tx, SkShader::TileMode ty,
+                                     const SkMatrix& localM);
 
 protected:
     void flatten(SkWriteBuffer&) const override;
diff --git a/src/shaders/SkLocalMatrixShader.h b/src/shaders/SkLocalMatrixShader.h
index 407c30d..a88f95e 100644
--- a/src/shaders/SkLocalMatrixShader.h
+++ b/src/shaders/SkLocalMatrixShader.h
@@ -63,7 +63,12 @@
 #endif
 
     bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override {
+#ifdef SK_SUPPORT_LEGACY_LOCAL_ROTATE_SHADER
         return as_SB(fProxyShader)->isRasterPipelineOnly(ctm);
+#else
+        return as_SB(fProxyShader)->isRasterPipelineOnly(SkMatrix::Concat(ctm,
+                                                                          this->getLocalMatrix()));
+#endif
     }
 
 private:
diff --git a/src/shaders/SkPictureShader.cpp b/src/shaders/SkPictureShader.cpp
index a14c211..16f5767 100644
--- a/src/shaders/SkPictureShader.cpp
+++ b/src/shaders/SkPictureShader.cpp
@@ -293,7 +293,7 @@
 
 bool SkPictureShader::onIsRasterPipelineOnly(const SkMatrix& ctm) const {
     return SkImageShader::IsRasterPipelineOnly(ctm, kN32_SkColorType, kPremul_SkAlphaType,
-                                               fTmx, fTmy);
+                                               fTmx, fTmy, this->getLocalMatrix());
 }
 
 bool SkPictureShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* cs, SkArenaAlloc* alloc,