diff options
author | 2018-04-10 16:47:46 -0400 | |
---|---|---|
committer | 2018-04-11 11:25:06 +0000 | |
commit | 2097fd03ffea48bd904c48c93348b2350600870e (patch) | |
tree | 11fac8634429396ed18c59d1e73a8e5dde379de8 /src/shaders/gradients | |
parent | a479f96dafa94549ed3b5b72d1d25bacd9d18b16 (diff) |
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 <fmalita@chromium.org>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/shaders/gradients')
-rw-r--r-- | src/shaders/gradients/SkLinearGradient.cpp | 9 | ||||
-rw-r--r-- | src/shaders/gradients/SkRadialGradient.cpp | 11 | ||||
-rw-r--r-- | src/shaders/gradients/SkSweepGradient.cpp | 9 | ||||
-rw-r--r-- | src/shaders/gradients/SkTwoPointConicalGradient.cpp | 8 | ||||
-rw-r--r-- | src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp | 13 |
5 files changed, 10 insertions, 40 deletions
diff --git a/src/shaders/gradients/SkLinearGradient.cpp b/src/shaders/gradients/SkLinearGradient.cpp index b6436ca801..a377442dc4 100644 --- a/src/shaders/gradients/SkLinearGradient.cpp +++ b/src/shaders/gradients/SkLinearGradient.cpp @@ -195,16 +195,9 @@ std::unique_ptr<GrFragmentProcessor> SkLinearGradient::asFragmentProcessor( SkASSERT(args.fContext); SkMatrix matrix; - if (!this->getLocalMatrix().invert(&matrix)) { + if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->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 3f71f38c1f..6d193615a4 100644 --- a/src/shaders/gradients/SkRadialGradient.cpp +++ b/src/shaders/gradients/SkRadialGradient.cpp @@ -162,19 +162,10 @@ void GrRadialGradient::GLSLRadialProcessor::emitCode(EmitArgs& args) { std::unique_ptr<GrFragmentProcessor> SkRadialGradient::asFragmentProcessor( const GrFPArgs& args) const { - SkASSERT(args.fContext); - SkMatrix matrix; - if (!this->getLocalMatrix().invert(&matrix)) { + if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->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 e9c4450b00..3f605d7761 100644 --- a/src/shaders/gradients/SkSweepGradient.cpp +++ b/src/shaders/gradients/SkSweepGradient.cpp @@ -216,16 +216,9 @@ void GrSweepGradient::GLSLSweepProcessor::emitCode(EmitArgs& args) { std::unique_ptr<GrFragmentProcessor> SkSweepGradient::asFragmentProcessor( const GrFPArgs& args) const { SkMatrix matrix; - if (!this->getLocalMatrix().invert(&matrix)) { + if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->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 cce25d00b7..88f0f82245 100644 --- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp +++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp @@ -175,9 +175,13 @@ void SkTwoPointConicalGradient::flatten(SkWriteBuffer& buffer) const { std::unique_ptr<GrFragmentProcessor> SkTwoPointConicalGradient::asFragmentProcessor( const GrFPArgs& args) const { - SkASSERT(args.fContext); + SkMatrix matrix; + if (!this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->invert(&matrix)) { + return nullptr; + } + return Gr2PtConicalGradientEffect::Make( - GrGradientEffect::CreateArgs(args.fContext, this, args.fLocalMatrix, fTileMode, + GrGradientEffect::CreateArgs(args.fContext, this, &matrix, fTileMode, args.fDstColorSpaceInfo->colorSpace())); } diff --git a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp index c242895f1c..9d447785ed 100644 --- a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp +++ b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp @@ -388,18 +388,7 @@ std::unique_ptr<GrFragmentProcessor> Gr2PtConicalGradientEffect::Make( const SkTwoPointConicalGradient& shader = *static_cast<const SkTwoPointConicalGradient*>(args.fShader); - SkMatrix matrix; - if (!shader.getLocalMatrix().invert(&matrix)) { - return nullptr; - } - if (args.fMatrix) { - SkMatrix inv; - if (!args.fMatrix->invert(&inv)) { - return nullptr; - } - matrix.postConcat(inv); - } - + SkMatrix matrix = *args.fMatrix; 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 |