diff options
author | Florin Malita <fmalita@chromium.org> | 2018-04-04 13:46:35 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-04-04 18:13:48 +0000 |
commit | af2769d00b70ca456452e4e88bdf5abecd320f68 (patch) | |
tree | 83fef5b2e2a4d66ec9de911cfc33fdc2d5ffe6dd /src/shaders/SkImageShader.cpp | |
parent | bf74a460814a7912ed3d2e1af000afd2c45cd318 (diff) |
Banish SkShaderBase::isRasterPipelineOnly()
Keeping related heuristics in sync with actual shader capabilities is somewhat tricky,
and overall fragile.
So how about this: instead of an explicit opt-in mechanism, try to instantiate a legacy
shader context and fall back to raster pipeline on failure (null Context => implicit
opt-in for raster pipeline). Shaders can still choose not to draw by returning both a
null Context and failing appendStages().
BUG=skia:7772
Change-Id: I2e76f51af7064853a6cb851b4c30c82eba3ee828
Reviewed-on: https://skia-review.googlesource.com/118383
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src/shaders/SkImageShader.cpp')
-rw-r--r-- | src/shaders/SkImageShader.cpp | 50 |
1 files changed, 19 insertions, 31 deletions
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp index c3e6931baf..cdd9413ace 100644 --- a/src/shaders/SkImageShader.cpp +++ b/src/shaders/SkImageShader.cpp @@ -69,14 +69,8 @@ bool SkImageShader::isOpaque() const { return fImage->isOpaque() && fTileModeX != kDecal_TileMode && fTileModeY != kDecal_TileMode; } -static bool legacy_shader_can_handle(const SkMatrix& a, const SkMatrix& b) { - SkMatrix m = SkMatrix::Concat(a, b); - if (!m.isScaleTranslate()) { - return false; - } - - SkMatrix inv; - if (!m.invert(&inv)) { +static bool legacy_shader_can_handle(const SkMatrix& inv) { + if (!inv.isScaleTranslate()) { return false; } @@ -97,37 +91,31 @@ static bool legacy_shader_can_handle(const SkMatrix& a, const SkMatrix& b) { return true; } -bool SkImageShader::IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType ct, SkAlphaType at, - SkShader::TileMode tx, SkShader::TileMode ty, - const SkMatrix& localM) { - if (ct != kN32_SkColorType) { - return true; +SkShaderBase::Context* SkImageShader::onMakeContext(const ContextRec& rec, + SkArenaAlloc* alloc) const { + const auto info = as_IB(fImage)->onImageInfo(); + + if (info.colorType() != kN32_SkColorType) { + return nullptr; } - if (at == kUnpremul_SkAlphaType) { - return true; + if (info.alphaType() == kUnpremul_SkAlphaType) { + return nullptr; } #ifndef SK_SUPPORT_LEGACY_TILED_BITMAPS - if (tx != ty) { - return true; + if (fTileModeX != fTileModeY) { + return nullptr; } #endif - if (tx == kDecal_TileMode || ty == kDecal_TileMode) { - return true; - } - if (!legacy_shader_can_handle(ctm, localM)) { - return true; + if (fTileModeX == kDecal_TileMode || fTileModeY == kDecal_TileMode) { + return nullptr; } - 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, this->getLocalMatrix()); -} + SkMatrix inv; + if (!this->computeTotalInverse(*rec.fMatrix, rec.fLocalMatrix, &inv) || + !legacy_shader_can_handle(inv)) { + return nullptr; + } -SkShaderBase::Context* SkImageShader::onMakeContext(const ContextRec& rec, - SkArenaAlloc* alloc) const { return SkBitmapProcLegacyShader::MakeContext(*this, fTileModeX, fTileModeY, SkBitmapProvider(fImage.get(), rec.fDstColorSpace), rec, alloc); |