From c64ee20e135a336ed775ccb6dec8a87efd19ec02 Mon Sep 17 00:00:00 2001 From: Robert Phillips Date: Wed, 11 Apr 2018 12:38:41 +0000 Subject: Revert "Fix handling of MaskFilter matrices" This reverts commit 2097fd03ffea48bd904c48c93348b2350600870e. Reason for revert: This is breaking a lot of Windows bots (esp. on the shadermaskfilter_localmatrix) Original change's description: > Fix handling of MaskFilter matrices > > 1) extend GrFPArgs to track pre/post local matrices, add helpers for > creating pre/post wrapper args > > 2) add a SkShaderBase helper (totalLocalMatrix) to centralize the LM > sandwich logic. > > 3) update call sites to use the above > > 4) rename SkMatrixFilter::makeWithLocalMatrix -> makeWithMatrix, to > disambiguate vs. SkShader::makeWithLocalMatrix. > > BUG=skia:7744 > > Change-Id: Ib2b7b007e6924979b00649dde7c94ef4b34771f1 > Reviewed-on: https://skia-review.googlesource.com/119330 > Commit-Queue: Florin Malita > Reviewed-by: Brian Salomon TBR=bsalomon@google.com,robertphillips@google.com,fmalita@chromium.org,reed@google.com Change-Id: I918dbb95bf00b3122e6699b84566ec82dbb5fc5c No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia:7744 Reviewed-on: https://skia-review.googlesource.com/120340 Reviewed-by: Robert Phillips Commit-Queue: Robert Phillips --- src/shaders/SkImageShader.cpp | 14 ++++- src/shaders/SkLocalMatrixShader.cpp | 7 ++- src/shaders/SkPerlinNoiseShader.cpp | 13 +++-- src/shaders/SkPictureShader.cpp | 67 +++++++++------------- src/shaders/SkPictureShader.h | 4 +- src/shaders/SkShader.cpp | 23 ++------ src/shaders/SkShaderBase.h | 14 +---- src/shaders/gradients/SkLinearGradient.cpp | 9 ++- src/shaders/gradients/SkRadialGradient.cpp | 11 +++- src/shaders/gradients/SkSweepGradient.cpp | 9 ++- .../gradients/SkTwoPointConicalGradient.cpp | 8 +-- .../gradients/SkTwoPointConicalGradient_gpu.cpp | 13 ++++- 12 files changed, 104 insertions(+), 88 deletions(-) (limited to 'src/shaders') diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp index 1838e9e498..265f7e6013 100644 --- a/src/shaders/SkImageShader.cpp +++ b/src/shaders/SkImageShader.cpp @@ -213,11 +213,19 @@ static GrSamplerState::WrapMode tile_mode_to_wrap_mode(const SkShader::TileMode std::unique_ptr SkImageShader::asFragmentProcessor( const GrFPArgs& args) const { - const auto lm = this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix); + SkMatrix lm = this->getLocalMatrix(); SkMatrix lmInverse; - if (!lm->invert(&lmInverse)) { + if (!lm.invert(&lmInverse)) { return nullptr; } + if (args.fLocalMatrix) { + SkMatrix inv; + if (!args.fLocalMatrix->invert(&inv)) { + return nullptr; + } + lmInverse.postConcat(inv); + lm.preConcat(*args.fLocalMatrix); + } GrSamplerState::WrapMode wrapModes[] = {tile_mode_to_wrap_mode(fTileModeX), tile_mode_to_wrap_mode(fTileModeY)}; @@ -228,7 +236,7 @@ std::unique_ptr SkImageShader::asFragmentProcessor( // are provided by the caller. bool doBicubic; GrSamplerState::Filter textureFilterMode = GrSkFilterQualityToGrFilterMode( - args.fFilterQuality, *args.fViewMatrix, *lm, + args.fFilterQuality, *args.fViewMatrix, lm, args.fContext->contextPriv().sharpenMipmappedTextures(), &doBicubic); GrSamplerState samplerState(wrapModes, textureFilterMode); sk_sp texColorSpace; diff --git a/src/shaders/SkLocalMatrixShader.cpp b/src/shaders/SkLocalMatrixShader.cpp index 78110f5821..ca99af1bef 100644 --- a/src/shaders/SkLocalMatrixShader.cpp +++ b/src/shaders/SkLocalMatrixShader.cpp @@ -15,8 +15,13 @@ #if SK_SUPPORT_GPU std::unique_ptr SkLocalMatrixShader::asFragmentProcessor( const GrFPArgs& args) const { + SkMatrix tmp = this->getLocalMatrix(); + if (args.fLocalMatrix) { + tmp.preConcat(*args.fLocalMatrix); + } return as_SB(fProxyShader) - ->asFragmentProcessor(args.makeWithPreLocalMatrix(this->getLocalMatrix())); + ->asFragmentProcessor(GrFPArgs(args.fContext, args.fViewMatrix, &tmp, + args.fFilterQuality, args.fDstColorSpaceInfo)); } #endif diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp index 8f6c85a494..6179da3d32 100644 --- a/src/shaders/SkPerlinNoiseShader.cpp +++ b/src/shaders/SkPerlinNoiseShader.cpp @@ -1394,8 +1394,13 @@ std::unique_ptr SkPerlinNoiseShaderImpl::asFragmentProcesso const GrFPArgs& args) const { SkASSERT(args.fContext); - const auto localMatrix = this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix); - const auto matrix = SkMatrix::Concat(*args.fViewMatrix, *localMatrix); + SkMatrix localMatrix = this->getLocalMatrix(); + if (args.fLocalMatrix) { + localMatrix.preConcat(*args.fLocalMatrix); + } + + SkMatrix matrix = *args.fViewMatrix; + matrix.preConcat(localMatrix); // Either we don't stitch tiles, either we have a valid tile size SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); @@ -1408,8 +1413,8 @@ std::unique_ptr SkPerlinNoiseShaderImpl::asFragmentProcesso matrix); SkMatrix m = *args.fViewMatrix; - m.setTranslateX(-localMatrix->getTranslateX() + SK_Scalar1); - m.setTranslateY(-localMatrix->getTranslateY() + SK_Scalar1); + m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); + m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); auto proxyProvider = args.fContext->contextPriv().proxyProvider(); if (fType == kImprovedNoise_Type) { diff --git a/src/shaders/SkPictureShader.cpp b/src/shaders/SkPictureShader.cpp index de642a7dda..1d19b04721 100644 --- a/src/shaders/SkPictureShader.cpp +++ b/src/shaders/SkPictureShader.cpp @@ -175,20 +175,24 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const { // // 1) a cached image shader, which wraps a single picture tile at the given CTM/local matrix // -// 2) a tile scale adjustment, to be applied downstream when dispatching createContext(), +// 2) a "composite" local matrix, to be passed down when dispatching createContext(), // appendStages() and asFragmentProcessor() in callers // // The composite local matrix includes the actual local matrix, any inherited/outer local matrix // and a scale component (to mape the actual tile bitmap size -> fTile size). // sk_sp SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, - const SkMatrix& localMatrix, + const SkMatrix* outerLocalMatrix, SkColorSpace* dstColorSpace, - SkVector* scaleAdjust, + SkMatrix* compositeLocalMatrix, const int maxTextureSize) const { SkASSERT(fPicture && !fPicture->cullRect().isEmpty()); - const SkMatrix m = SkMatrix::Concat(viewMatrix, localMatrix); + *compositeLocalMatrix = this->getLocalMatrix(); + if (outerLocalMatrix) { + compositeLocalMatrix->preConcat(*outerLocalMatrix); + } + const SkMatrix m = SkMatrix::Concat(viewMatrix, *compositeLocalMatrix); // Use a rotation-invariant scale SkPoint scale; @@ -270,52 +274,37 @@ sk_sp SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, fAddedToCache.store(true); } - scaleAdjust->set(1 / tileScale.width(), 1 / tileScale.height()); + compositeLocalMatrix->preScale(1 / tileScale.width(), 1 / tileScale.height()); return tileShader; } bool SkPictureShader::onAppendStages(const StageRec& rec) const { - auto lm = this->totalLocalMatrix(rec.fLocalM); - SkVector scaleAdjust; - // Keep bitmapShader alive by using alloc instead of stack memory auto& bitmapShader = *rec.fAlloc->make>(); - bitmapShader = this->refBitmapShader(rec.fCTM, *lm, rec.fDstCS, &scaleAdjust); - - if (!bitmapShader) { - return false; - } - - if (scaleAdjust != SkVector::Make(1, 1)) { - lm.writable()->preScale(scaleAdjust.fX, scaleAdjust.fY); - } + SkMatrix compositeLocalMatrix; + bitmapShader = this->refBitmapShader(rec.fCTM, rec.fLocalM, rec.fDstCS, &compositeLocalMatrix); StageRec localRec = rec; - localRec.fLocalM = lm->isIdentity() ? nullptr : &(*lm); + localRec.fLocalM = compositeLocalMatrix.isIdentity() ? nullptr : &compositeLocalMatrix; - return as_SB(bitmapShader)->appendStages(localRec); + return bitmapShader && as_SB(bitmapShader)->appendStages(localRec); } ///////////////////////////////////////////////////////////////////////////////////////// SkShaderBase::Context* SkPictureShader::onMakeContext(const ContextRec& rec, SkArenaAlloc* alloc) const { - auto lm = this->totalLocalMatrix(rec.fLocalMatrix); - SkVector scaleAdjust; + SkMatrix compositeLocalMatrix; sk_sp bitmapShader = this->refBitmapShader(*rec.fMatrix, - *lm, + rec.fLocalMatrix, rec.fDstColorSpace, - &scaleAdjust); + &compositeLocalMatrix); if (!bitmapShader) { return nullptr; } - if (scaleAdjust != SkVector::Make(1, 1)) { - lm.writable()->preScale(scaleAdjust.fX, scaleAdjust.fY); - } - ContextRec localRec = rec; - localRec.fLocalMatrix = lm->isIdentity() ? nullptr : &(*lm); + localRec.fLocalMatrix = compositeLocalMatrix.isIdentity() ? nullptr : &compositeLocalMatrix; PictureShaderContext* ctx = alloc->make(*this, localRec, std::move(bitmapShader), alloc); @@ -380,22 +369,20 @@ std::unique_ptr SkPictureShader::asFragmentProcessor( if (args.fContext) { maxTextureSize = args.fContext->caps()->maxTextureSize(); } - - auto lm = this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix); - SkVector scaleAdjust; - sk_sp bitmapShader(this->refBitmapShader(*args.fViewMatrix,*lm, + SkMatrix compositeLocalMatrix; + sk_sp bitmapShader(this->refBitmapShader(*args.fViewMatrix, args.fLocalMatrix, args.fDstColorSpaceInfo->colorSpace(), - &scaleAdjust, maxTextureSize)); + &compositeLocalMatrix, + maxTextureSize)); if (!bitmapShader) { return nullptr; } - if (scaleAdjust != SkVector::Make(1, 1)) { - lm.writable()->preScale(scaleAdjust.fX, scaleAdjust.fY); - } - - GrFPArgs newArgs(args.fContext, args.fViewMatrix, args.fFilterQuality, args.fDstColorSpaceInfo); - - return as_SB(bitmapShader)->asFragmentProcessor(newArgs.makeWithPreLocalMatrix(*lm)); + return as_SB(bitmapShader)->asFragmentProcessor( + GrFPArgs(args.fContext, + args.fViewMatrix, + compositeLocalMatrix.isIdentity() ? nullptr : &compositeLocalMatrix, + args.fFilterQuality, + args.fDstColorSpaceInfo)); } #endif diff --git a/src/shaders/SkPictureShader.h b/src/shaders/SkPictureShader.h index 5f28b6074b..4970dac81b 100644 --- a/src/shaders/SkPictureShader.h +++ b/src/shaders/SkPictureShader.h @@ -46,9 +46,9 @@ private: SkPictureShader(sk_sp, TileMode, TileMode, const SkMatrix*, const SkRect*, sk_sp); - sk_sp refBitmapShader(const SkMatrix&, const SkMatrix& localMatrix, + sk_sp refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix, SkColorSpace* dstColorSpace, - SkVector* scaleAdjust, + SkMatrix* compositeLocalMatrix, const int maxTextureSize = 0) const; class PictureShaderContext : public Context { diff --git a/src/shaders/SkShader.cpp b/src/shaders/SkShader.cpp index f3ffd26ef4..265f22beaa 100644 --- a/src/shaders/SkShader.cpp +++ b/src/shaders/SkShader.cpp @@ -67,26 +67,15 @@ void SkShaderBase::flatten(SkWriteBuffer& buffer) const { } } -SkTCopyOnFirstWrite -SkShaderBase::totalLocalMatrix(const SkMatrix* preLocalMatrix, - const SkMatrix* postLocalMatrix) const { - SkTCopyOnFirstWrite m(fLocalMatrix); - - if (preLocalMatrix) { - m.writable()->preConcat(*preLocalMatrix); - } - - if (postLocalMatrix) { - m.writable()->postConcat(*postLocalMatrix); - } - - return m; -} - bool SkShaderBase::computeTotalInverse(const SkMatrix& ctm, const SkMatrix* outerLocalMatrix, SkMatrix* totalInverse) const { - return SkMatrix::Concat(ctm, *this->totalLocalMatrix(outerLocalMatrix)).invert(totalInverse); + SkMatrix total = SkMatrix::Concat(ctm, fLocalMatrix); + if (outerLocalMatrix) { + total.preConcat(*outerLocalMatrix); + } + + return total.invert(totalInverse); } bool SkShaderBase::asLuminanceColor(SkColor* colorPtr) const { diff --git a/src/shaders/SkShaderBase.h b/src/shaders/SkShaderBase.h index cddc5540ee..89674a6ebb 100644 --- a/src/shaders/SkShaderBase.h +++ b/src/shaders/SkShaderBase.h @@ -12,7 +12,6 @@ #include "SkMask.h" #include "SkMatrix.h" #include "SkShader.h" -#include "SkTLazy.h" #if SK_SUPPORT_GPU #include "GrFPArgs.h" @@ -186,16 +185,9 @@ public: // If this returns false, then we draw nothing (do not fall back to shader context) bool appendStages(const StageRec&) const; - bool SK_WARN_UNUSED_RESULT computeTotalInverse(const SkMatrix& ctm, - const SkMatrix* outerLocalMatrix, - SkMatrix* totalInverse) const; - - // Returns the total local matrix for this shader: - // - // M = postLocalMatrix x shaderLocalMatrix x preLocalMatrix - // - SkTCopyOnFirstWrite totalLocalMatrix(const SkMatrix* preLocalMatrix, - const SkMatrix* postLocalMatrix = nullptr) const; + bool computeTotalInverse(const SkMatrix& ctm, + const SkMatrix* outerLocalMatrix, + SkMatrix* totalInverse) const; #ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP virtual bool onIsABitmap(SkBitmap*, SkMatrix*, TileMode[2]) const { diff --git a/src/shaders/gradients/SkLinearGradient.cpp b/src/shaders/gradients/SkLinearGradient.cpp index a377442dc4..b6436ca801 100644 --- a/src/shaders/gradients/SkLinearGradient.cpp +++ b/src/shaders/gradients/SkLinearGradient.cpp @@ -195,9 +195,16 @@ std::unique_ptr SkLinearGradient::asFragmentProcessor( SkASSERT(args.fContext); SkMatrix matrix; - if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->invert(&matrix)) { + if (!this->getLocalMatrix().invert(&matrix)) { return nullptr; } + if (args.fLocalMatrix) { + SkMatrix inv; + if (!args.fLocalMatrix->invert(&inv)) { + return nullptr; + } + matrix.postConcat(inv); + } matrix.postConcat(fPtsToUnit); return GrLinearGradient::Make(GrGradientEffect::CreateArgs( diff --git a/src/shaders/gradients/SkRadialGradient.cpp b/src/shaders/gradients/SkRadialGradient.cpp index 6d193615a4..3f71f38c1f 100644 --- a/src/shaders/gradients/SkRadialGradient.cpp +++ b/src/shaders/gradients/SkRadialGradient.cpp @@ -162,10 +162,19 @@ void GrRadialGradient::GLSLRadialProcessor::emitCode(EmitArgs& args) { std::unique_ptr SkRadialGradient::asFragmentProcessor( const GrFPArgs& args) const { + SkASSERT(args.fContext); + SkMatrix matrix; - if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->invert(&matrix)) { + if (!this->getLocalMatrix().invert(&matrix)) { return nullptr; } + if (args.fLocalMatrix) { + SkMatrix inv; + if (!args.fLocalMatrix->invert(&inv)) { + return nullptr; + } + matrix.postConcat(inv); + } matrix.postConcat(fPtsToUnit); return GrRadialGradient::Make(GrGradientEffect::CreateArgs( diff --git a/src/shaders/gradients/SkSweepGradient.cpp b/src/shaders/gradients/SkSweepGradient.cpp index 3f605d7761..e9c4450b00 100644 --- a/src/shaders/gradients/SkSweepGradient.cpp +++ b/src/shaders/gradients/SkSweepGradient.cpp @@ -216,9 +216,16 @@ void GrSweepGradient::GLSLSweepProcessor::emitCode(EmitArgs& args) { std::unique_ptr SkSweepGradient::asFragmentProcessor( const GrFPArgs& args) const { SkMatrix matrix; - if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->invert(&matrix)) { + if (!this->getLocalMatrix().invert(&matrix)) { return nullptr; } + if (args.fLocalMatrix) { + SkMatrix inv; + if (!args.fLocalMatrix->invert(&inv)) { + return nullptr; + } + matrix.postConcat(inv); + } matrix.postConcat(fPtsToUnit); return GrSweepGradient::Make( diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.cpp b/src/shaders/gradients/SkTwoPointConicalGradient.cpp index 88f0f82245..cce25d00b7 100644 --- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp +++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp @@ -175,13 +175,9 @@ void SkTwoPointConicalGradient::flatten(SkWriteBuffer& buffer) const { std::unique_ptr SkTwoPointConicalGradient::asFragmentProcessor( const GrFPArgs& args) const { - SkMatrix matrix; - if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->invert(&matrix)) { - return nullptr; - } - + SkASSERT(args.fContext); return Gr2PtConicalGradientEffect::Make( - GrGradientEffect::CreateArgs(args.fContext, this, &matrix, fTileMode, + GrGradientEffect::CreateArgs(args.fContext, this, args.fLocalMatrix, fTileMode, args.fDstColorSpaceInfo->colorSpace())); } diff --git a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp index 9d447785ed..c242895f1c 100644 --- a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp +++ b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp @@ -388,7 +388,18 @@ std::unique_ptr Gr2PtConicalGradientEffect::Make( const SkTwoPointConicalGradient& shader = *static_cast(args.fShader); - SkMatrix matrix = *args.fMatrix; + SkMatrix matrix; + if (!shader.getLocalMatrix().invert(&matrix)) { + return nullptr; + } + if (args.fMatrix) { + SkMatrix inv; + if (!args.fMatrix->invert(&inv)) { + return nullptr; + } + matrix.postConcat(inv); + } + GrGradientEffect::CreateArgs newArgs(args.fContext, args.fShader, &matrix, args.fWrapMode, args.fDstColorSpace); // Data and matrix has to be prepared before constructing TwoPointConicalEffect so its parent -- cgit v1.2.3