aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders/SkImageShader.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2018-04-04 13:46:35 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-04-04 18:13:48 +0000
commitaf2769d00b70ca456452e4e88bdf5abecd320f68 (patch)
tree83fef5b2e2a4d66ec9de911cfc33fdc2d5ffe6dd /src/shaders/SkImageShader.cpp
parentbf74a460814a7912ed3d2e1af000afd2c45cd318 (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.cpp50
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);