diff options
author | Mike Reed <reed@google.com> | 2017-08-08 16:29:22 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-08-08 21:32:42 +0000 |
commit | 3404207e2418e791231e36d2848e9137d6c73cad (patch) | |
tree | 23a56e88ce668387eea71137f96b2dd56c6aff36 | |
parent | 4d011bef0adb7f7bf52e96364a02b2af1312255b (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.cpp | 2 | ||||
-rw-r--r-- | src/shaders/SkColorFilterShader.h | 2 | ||||
-rw-r--r-- | src/shaders/SkComposeShader.h | 2 | ||||
-rw-r--r-- | src/shaders/SkImageShader.cpp | 11 | ||||
-rw-r--r-- | src/shaders/SkImageShader.h | 4 | ||||
-rw-r--r-- | src/shaders/SkLocalMatrixShader.h | 4 | ||||
-rw-r--r-- | src/shaders/SkPictureShader.cpp | 5 | ||||
-rw-r--r-- | src/shaders/SkPictureShader.h | 2 | ||||
-rw-r--r-- | src/shaders/SkShader.cpp | 4 | ||||
-rw-r--r-- | src/shaders/SkShaderBase.h | 7 | ||||
-rw-r--r-- | src/shaders/gradients/SkRadialGradient.h | 2 | ||||
-rw-r--r-- | src/shaders/gradients/SkSweepGradient.h | 2 | ||||
-rw-r--r-- | src/shaders/gradients/SkTwoPointConicalGradient.h | 2 | ||||
-rw-r--r-- | tests/ImageFilterTest.cpp | 2 |
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; } |