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/public.bzl b/public.bzl
index 8004273..b35f9ec 100644
--- a/public.bzl
+++ b/public.bzl
@@ -665,6 +665,7 @@
# Required for building dm.
"GR_TEST_UTILS",
# Staging flags for API changes
+ "SK_SUPPORT_LEGACY_LOCAL_ROTATE_SHADER",
# Should remove after we update golden images
"SK_WEBP_ENCODER_USE_DEFAULT_METHOD",
# Experiment to diagnose image diffs in Google3
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 4b7990c..502f076 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -79,7 +79,11 @@
}
bool SkBitmapProcInfo::init(const SkMatrix& inv, const SkPaint& paint) {
+#ifdef SK_SUPPORT_LEGACY_LOCAL_ROTATE_SHADER
SkASSERT(!inv.hasPerspective());
+#else
+ SkASSERT(inv.isScaleTranslate());
+#endif
fPixmap.reset();
fInvMatrix = inv;
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,