aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-08-08 16:29:22 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-08-08 21:32:42 +0000
commit3404207e2418e791231e36d2848e9137d6c73cad (patch)
tree23a56e88ce668387eea71137f96b2dd56c6aff36
parent4d011bef0adb7f7bf52e96364a02b2af1312255b (diff)
use rasterpipeline for images if matrix is >= scale+translate
Bug: skia: Change-Id: I36112fe54c6f2d0965d0b88f0291d7ffe0902715 Reviewed-on: https://skia-review.googlesource.com/30480 Commit-Queue: Mike Reed <reed@google.com> Reviewed-by: Mike Klein <mtklein@chromium.org> Reviewed-by: Florin Malita <fmalita@chromium.org>
-rw-r--r--src/core/SkBlitter.cpp2
-rw-r--r--src/shaders/SkColorFilterShader.h2
-rw-r--r--src/shaders/SkComposeShader.h2
-rw-r--r--src/shaders/SkImageShader.cpp11
-rw-r--r--src/shaders/SkImageShader.h4
-rw-r--r--src/shaders/SkLocalMatrixShader.h4
-rw-r--r--src/shaders/SkPictureShader.cpp5
-rw-r--r--src/shaders/SkPictureShader.h2
-rw-r--r--src/shaders/SkShader.cpp4
-rw-r--r--src/shaders/SkShaderBase.h7
-rw-r--r--src/shaders/gradients/SkRadialGradient.h2
-rw-r--r--src/shaders/gradients/SkSweepGradient.h2
-rw-r--r--src/shaders/gradients/SkTwoPointConicalGradient.h2
-rw-r--r--tests/ImageFilterTest.cpp2
14 files changed, 28 insertions, 23 deletions
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
index 6bd48bef85..a1a1db6ce5 100644
--- a/src/core/SkBlitter.cpp
+++ b/src/core/SkBlitter.cpp
@@ -913,7 +913,7 @@ bool SkBlitter::UseRasterPipelineBlitter(const SkPixmap& device, const SkPaint&
return true;
}
// ... or unless the shader is raster pipeline-only.
- if (paint.getShader() && as_SB(paint.getShader())->isRasterPipelineOnly()) {
+ if (paint.getShader() && as_SB(paint.getShader())->isRasterPipelineOnly(matrix)) {
return true;
}
diff --git a/src/shaders/SkColorFilterShader.h b/src/shaders/SkColorFilterShader.h
index 001f3cce70..3a1878fb2e 100644
--- a/src/shaders/SkColorFilterShader.h
+++ b/src/shaders/SkColorFilterShader.h
@@ -29,7 +29,7 @@ protected:
sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
bool onAppendStages(SkRasterPipeline*, SkColorSpace* dstCS, SkArenaAlloc*,
const SkMatrix&, const SkPaint&, const SkMatrix* localM) const override;
- bool onIsRasterPipelineOnly() const override { return true; }
+ bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; }
private:
sk_sp<SkShader> fShader;
diff --git a/src/shaders/SkComposeShader.h b/src/shaders/SkComposeShader.h
index 432915dfba..1389742c3a 100644
--- a/src/shaders/SkComposeShader.h
+++ b/src/shaders/SkComposeShader.h
@@ -45,7 +45,7 @@ protected:
bool onAppendStages(SkRasterPipeline*, SkColorSpace* dstCS, SkArenaAlloc*,
const SkMatrix&, const SkPaint&, const SkMatrix* localM) const override;
- bool onIsRasterPipelineOnly() const override { return true; }
+ bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; }
private:
sk_sp<SkShader> fDst;
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 6657743b01..609ad4b869 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -61,7 +61,7 @@ bool SkImageShader::isOpaque() const {
return fImage->isOpaque();
}
-bool SkImageShader::IsRasterPipelineOnly(SkColorType ct, SkAlphaType at,
+bool SkImageShader::IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType ct, SkAlphaType at,
SkShader::TileMode tx, SkShader::TileMode ty) {
if (ct != kN32_SkColorType) {
return true;
@@ -72,12 +72,17 @@ bool SkImageShader::IsRasterPipelineOnly(SkColorType ct, SkAlphaType at,
if (tx != ty) {
return true;
}
+#ifndef SK_SUPPORT_LEGACY_ROTATED_SHADERS
+ if (!ctm.isScaleTranslate()) {
+ return true;
+ }
+#endif
return false;
}
-bool SkImageShader::onIsRasterPipelineOnly() const {
+bool SkImageShader::onIsRasterPipelineOnly(const SkMatrix& ctm) const {
SkBitmapProvider provider(fImage.get(), nullptr);
- return IsRasterPipelineOnly(provider.info().colorType(), provider.info().alphaType(),
+ return IsRasterPipelineOnly(ctm, provider.info().colorType(), provider.info().alphaType(),
fTileModeX, fTileModeY);
}
diff --git a/src/shaders/SkImageShader.h b/src/shaders/SkImageShader.h
index b74c315480..b499b927a5 100644
--- a/src/shaders/SkImageShader.h
+++ b/src/shaders/SkImageShader.h
@@ -29,7 +29,7 @@ public:
SkImageShader(sk_sp<SkImage>, TileMode tx, TileMode ty, const SkMatrix* localMatrix);
- static bool IsRasterPipelineOnly(SkColorType, SkAlphaType,
+ static bool IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType, SkAlphaType,
SkShader::TileMode tx, SkShader::TileMode ty);
protected:
@@ -40,7 +40,7 @@ protected:
#endif
SkImage* onIsAImage(SkMatrix*, TileMode*) const override;
- bool onIsRasterPipelineOnly() const override;
+ bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override;
bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
const SkMatrix& ctm, const SkPaint&, const SkMatrix*) const override;
diff --git a/src/shaders/SkLocalMatrixShader.h b/src/shaders/SkLocalMatrixShader.h
index 5ae8e03df4..3ae44cf559 100644
--- a/src/shaders/SkLocalMatrixShader.h
+++ b/src/shaders/SkLocalMatrixShader.h
@@ -62,8 +62,8 @@ protected:
}
#endif
- bool onIsRasterPipelineOnly() const override {
- return as_SB(fProxyShader)->isRasterPipelineOnly();
+ bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override {
+ return as_SB(fProxyShader)->isRasterPipelineOnly(ctm);
}
private:
diff --git a/src/shaders/SkPictureShader.cpp b/src/shaders/SkPictureShader.cpp
index 95a128e7e0..4c746ee94f 100644
--- a/src/shaders/SkPictureShader.cpp
+++ b/src/shaders/SkPictureShader.cpp
@@ -291,8 +291,9 @@ sk_sp<SkShader> SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, con
return tileShader;
}
-bool SkPictureShader::onIsRasterPipelineOnly() const {
- return SkImageShader::IsRasterPipelineOnly(kN32_SkColorType, kPremul_SkAlphaType, fTmx, fTmy);
+bool SkPictureShader::onIsRasterPipelineOnly(const SkMatrix& ctm) const {
+ return SkImageShader::IsRasterPipelineOnly(ctm, kN32_SkColorType, kPremul_SkAlphaType,
+ fTmx, fTmy);
}
bool SkPictureShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* cs, SkArenaAlloc* alloc,
diff --git a/src/shaders/SkPictureShader.h b/src/shaders/SkPictureShader.h
index ee89f886e4..3d58d6db38 100644
--- a/src/shaders/SkPictureShader.h
+++ b/src/shaders/SkPictureShader.h
@@ -42,7 +42,7 @@ protected:
const SkMatrix&, const SkPaint&, const SkMatrix*) const override;
Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
- bool onIsRasterPipelineOnly() const override;
+ bool onIsRasterPipelineOnly(const SkMatrix&) const override;
private:
SkPictureShader(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*, const SkRect*,
diff --git a/src/shaders/SkShader.cpp b/src/shaders/SkShader.cpp
index cc0d6b19d5..5540b2d95f 100644
--- a/src/shaders/SkShader.cpp
+++ b/src/shaders/SkShader.cpp
@@ -91,8 +91,6 @@ bool SkShaderBase::asLuminanceColor(SkColor* colorPtr) const {
}
SkShaderBase::Context* SkShaderBase::makeContext(const ContextRec& rec, SkArenaAlloc* alloc) const {
- SkASSERT(!this->isRasterPipelineOnly());
-
return this->computeTotalInverse(*rec.fMatrix, rec.fLocalMatrix, nullptr)
? this->onMakeContext(rec, alloc)
: nullptr;
@@ -117,7 +115,7 @@ SkShaderBase::Context::Context(const SkShaderBase& shader, const ContextRec& rec
: fShader(shader), fCTM(*rec.fMatrix)
{
// We should never use a context for RP-only shaders.
- SkASSERT(!shader.isRasterPipelineOnly());
+ SkASSERT(!shader.isRasterPipelineOnly(*rec.fMatrix));
// ... or for perspective.
SkASSERT(!rec.fMatrix->hasPerspective());
SkASSERT(!rec.fLocalMatrix || !rec.fLocalMatrix->hasPerspective());
diff --git a/src/shaders/SkShaderBase.h b/src/shaders/SkShaderBase.h
index 783fff4db5..99cace22f9 100644
--- a/src/shaders/SkShaderBase.h
+++ b/src/shaders/SkShaderBase.h
@@ -187,9 +187,10 @@ public:
return this->onMakeColorSpace(xformer);
}
- bool isRasterPipelineOnly() const {
+ bool isRasterPipelineOnly(const SkMatrix& ctm) const {
// We always use RP when perspective is present.
- return fLocalMatrix.hasPerspective() || this->onIsRasterPipelineOnly();
+ return ctm.hasPerspective() || fLocalMatrix.hasPerspective()
+ || this->onIsRasterPipelineOnly(ctm);
}
// If this returns false, then we draw nothing (do not fall back to shader context)
@@ -247,7 +248,7 @@ protected:
virtual bool onAppendStages(SkRasterPipeline*, SkColorSpace* dstCS, SkArenaAlloc*,
const SkMatrix&, const SkPaint&, const SkMatrix* localM) const;
- virtual bool onIsRasterPipelineOnly() const { return false; }
+ virtual bool onIsRasterPipelineOnly(const SkMatrix& ctm) const { return false; }
private:
// This is essentially const, but not officially so it can be modified in constructors.
diff --git a/src/shaders/gradients/SkRadialGradient.h b/src/shaders/gradients/SkRadialGradient.h
index 5becf0a2c2..8cd7df2680 100644
--- a/src/shaders/gradients/SkRadialGradient.h
+++ b/src/shaders/gradients/SkRadialGradient.h
@@ -30,7 +30,7 @@ protected:
void appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* tPipeline,
SkRasterPipeline* postPipeline) const override;
- bool onIsRasterPipelineOnly() const override { return true; }
+ bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; }
private:
const SkPoint fCenter;
diff --git a/src/shaders/gradients/SkSweepGradient.h b/src/shaders/gradients/SkSweepGradient.h
index 92d3411b01..b42f270d5c 100644
--- a/src/shaders/gradients/SkSweepGradient.h
+++ b/src/shaders/gradients/SkSweepGradient.h
@@ -30,7 +30,7 @@ protected:
void appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* tPipeline,
SkRasterPipeline* postPipeline) const override;
- bool onIsRasterPipelineOnly() const override { return true; }
+ bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; }
private:
const SkPoint fCenter;
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.h b/src/shaders/gradients/SkTwoPointConicalGradient.h
index 81b3b202f3..408f31d8d3 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.h
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.h
@@ -41,7 +41,7 @@ protected:
void appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* tPipeline,
SkRasterPipeline* postPipeline) const override;
- bool onIsRasterPipelineOnly() const override { return true; }
+ bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; }
private:
enum class Type {
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index b8492d2dcb..a0618e5893 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -750,7 +750,7 @@ DEF_TEST(ImageFilterDrawTiled, reporter) {
}
untiledCanvas.flush();
tiledCanvas.flush();
- if (!sk_tool_utils::equal_pixels(untiledResult, tiledResult, 0)) {
+ if (!sk_tool_utils::equal_pixels(untiledResult, tiledResult, 1)) {
REPORTER_ASSERT_MESSAGE(reporter, false, filters.getName(i));
break;
}