diff options
author | Mike Reed <reed@google.com> | 2018-01-19 14:03:47 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-19 19:39:16 +0000 |
commit | a99b39399522658d7e5ddee97d0e45aa9fceaf89 (patch) | |
tree | 7c4cdcee7ecf4b152933382604793daa94f95b1b /src | |
parent | c22e50bd317fe3658445c04e18a6e319d746c510 (diff) |
use GrFPArgs for maskfilters
Bug: skia:
Change-Id: I8516a3b0f6d8301c51f0861c65b9fe8f692fc5e5
Reviewed-on: https://skia-review.googlesource.com/97260
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkMaskFilter.cpp | 19 | ||||
-rw-r--r-- | src/effects/SkRRectsGaussianEdgeMaskFilter.cpp | 17 | ||||
-rw-r--r-- | src/gpu/GrBlurUtils.cpp | 2 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 6 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 10 |
5 files changed, 37 insertions, 17 deletions
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp index fb6d47bffe..b8aadec10c 100644 --- a/src/core/SkMaskFilter.cpp +++ b/src/core/SkMaskFilter.cpp @@ -17,6 +17,7 @@ #if SK_SUPPORT_GPU #include "GrTextureProxy.h" +#include "GrFragmentProcessor.h" #endif SkMaskFilter::NinePatch::~NinePatch() { @@ -301,6 +302,24 @@ SkMaskFilter::filterRectsToNine(const SkRect[], int count, const SkMatrix&, } #if SK_SUPPORT_GPU +std::unique_ptr<GrFragmentProcessor> SkMaskFilter::asFragmentProcessor(const GrFPArgs& args) const { + auto fp = this->onAsFragmentProcessor(args); + if (fp) { + SkASSERT(this->hasFragmentProcessor()); + } else { + SkASSERT(!this->hasFragmentProcessor()); + } + return fp; +} +bool SkMaskFilter::hasFragmentProcessor() const { + return this->onHasFragmentProcessor(); +} + +std::unique_ptr<GrFragmentProcessor> SkMaskFilter::onAsFragmentProcessor(const GrFPArgs&) const { + return nullptr; +} +bool SkMaskFilter::onHasFragmentProcessor() const { return false; } + bool SkMaskFilter::canFilterMaskGPU(const SkRRect& devRRect, const SkIRect& clipBounds, const SkMatrix& ctm, diff --git a/src/effects/SkRRectsGaussianEdgeMaskFilter.cpp b/src/effects/SkRRectsGaussianEdgeMaskFilter.cpp index 27bf09fd7c..09739c0813 100644 --- a/src/effects/SkRRectsGaussianEdgeMaskFilter.cpp +++ b/src/effects/SkRRectsGaussianEdgeMaskFilter.cpp @@ -32,16 +32,17 @@ public: bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, SkIPoint* margin) const override; -#if SK_SUPPORT_GPU - bool asFragmentProcessor(GrFragmentProcessor**) const override; -#endif - SK_TO_STRING_OVERRIDE() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkRRectsGaussianEdgeMaskFilterImpl) protected: void flatten(SkWriteBuffer&) const override; +#if SK_SUPPORT_GPU + std::unique_ptr<GrFragmentProcessor> onAsFragmentProcessor(const GrFPArgs& args) const override; + bool onHasFragmentProcessor() const override { return true; } +#endif + private: SkRRect fFirst; SkRRect fSecond; @@ -509,12 +510,10 @@ private: }; //////////////////////////////////////////////////////////////////////////// -bool SkRRectsGaussianEdgeMaskFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp) const { - if (fp) { - *fp = RRectsGaussianEdgeFP::Make(fFirst, fSecond, fRadius).release(); - } - return true; +std::unique_ptr<GrFragmentProcessor> +SkRRectsGaussianEdgeMaskFilterImpl::onAsFragmentProcessor(const GrFPArgs& args) const { + return RRectsGaussianEdgeFP::Make(fFirst, fSecond, fRadius); } #endif diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp index dcd4a99ece..aff3647f6c 100644 --- a/src/gpu/GrBlurUtils.cpp +++ b/src/gpu/GrBlurUtils.cpp @@ -298,7 +298,7 @@ void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, } GrAA aa = GrAA(paint.isAntiAlias()); SkMaskFilter* mf = paint.getMaskFilter(); - if (mf && !mf->asFragmentProcessor(nullptr)) { + if (mf && !mf->hasFragmentProcessor()) { // The MaskFilter wasn't already handled in SkPaintToGrPaint draw_path_with_mask_filter(context, renderTargetContext, clip, std::move(grPaint), aa, viewMatrix, mf, style, path, pathIsMutable); diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 8d6e55c1f6..3f7dcb41e0 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -403,8 +403,10 @@ void SkGpuDevice::drawRRect(const SkRRect& rrect, const SkPaint& paint) { } SkMaskFilter* mf = paint.getMaskFilter(); - if (mf && mf->asFragmentProcessor(nullptr)) { - mf = nullptr; // already handled in SkPaintToGrPaint + if (mf) { + if (mf->hasFragmentProcessor()) { + mf = nullptr; // already handled in SkPaintToGrPaint + } } GrStyle style(paint); diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 58dbb10df0..9342cd676b 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -375,6 +375,8 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, // Convert SkPaint color to 4f format, including optional linearizing and gamut conversion. GrColor4f origColor = SkColorToUnpremulGrColor4f(skPaint.getColor(), colorSpaceInfo); + const GrFPArgs fpArgs(context, &viewM, nullptr, skPaint.getFilterQuality(), &colorSpaceInfo); + // Setup the initial color considering the shader, the SkPaint color, and the presence or not // of per-vertex colors. std::unique_ptr<GrFragmentProcessor> shaderFP; @@ -382,8 +384,7 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, if (shaderProcessor) { shaderFP = std::move(*shaderProcessor); } else if (const auto* shader = as_SB(skPaint.getShader())) { - shaderFP = shader->asFragmentProcessor(GrFPArgs( - context, &viewM, nullptr, skPaint.getFilterQuality(), &colorSpaceInfo)); + shaderFP = shader->asFragmentProcessor(fpArgs); } } @@ -478,9 +479,8 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, SkMaskFilter* maskFilter = skPaint.getMaskFilter(); if (maskFilter) { - GrFragmentProcessor* mfFP; - if (maskFilter->asFragmentProcessor(&mfFP)) { - grPaint->addCoverageFragmentProcessor(std::unique_ptr<GrFragmentProcessor>(mfFP)); + if (auto mfFP = maskFilter->asFragmentProcessor(fpArgs)) { + grPaint->addCoverageFragmentProcessor(std::move(mfFP)); } } |