aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkMaskFilter.h27
-rw-r--r--src/core/SkMaskFilter.cpp19
-rw-r--r--src/effects/SkRRectsGaussianEdgeMaskFilter.cpp17
-rw-r--r--src/gpu/GrBlurUtils.cpp2
-rw-r--r--src/gpu/SkGpuDevice.cpp6
-rw-r--r--src/gpu/SkGr.cpp10
6 files changed, 27 insertions, 54 deletions
diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h
index 3e10dc9ad3..1714d17bca 100644
--- a/include/core/SkMaskFilter.h
+++ b/include/core/SkMaskFilter.h
@@ -6,6 +6,7 @@
* found in the LICENSE file.
*/
+
#ifndef SkMaskFilter_DEFINED
#define SkMaskFilter_DEFINED
@@ -17,7 +18,6 @@
class GrClip;
class GrContext;
-struct GrFPArgs;
class GrRenderTargetContext;
class GrPaint;
class GrFragmentProcessor;
@@ -69,18 +69,16 @@ public:
#if SK_SUPPORT_GPU
/**
- * Returns a processor if the filter can be expressed a single-pass GrProcessor without
- * requiring an explicit input mask. Per-pixel, the effect receives the incoming mask's
- * coverage as the input color and outputs the filtered covereage value. This means that each
- * pixel's filtered coverage must only depend on the unfiltered mask value for that pixel and
- * not on surrounding values.
- */
- std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs& args) const;
-
- /**
- * Returns true iff asFragmentProcessor() will return a processor
+ * Returns true if the filter can be expressed a single-pass GrProcessor without requiring an
+ * explicit input mask. Per-pixel, the effect receives the incoming mask's coverage as
+ * the input color and outputs the filtered covereage value. This means that each pixel's
+ * filtered coverage must only depend on the unfiltered mask value for that pixel and not on
+ * surrounding values.
+ *
+ * If effect is non-NULL, a new GrProcessor instance is stored in it. The caller assumes
+ * ownership of the effect and must unref it.
*/
- bool hasFragmentProcessor() const;
+ virtual bool asFragmentProcessor(GrFragmentProcessor**) const { return false; }
/**
* If asFragmentProcessor() fails the filter may be implemented on the GPU by a subclass
@@ -181,11 +179,6 @@ public:
protected:
SkMaskFilter() {}
-#if SK_SUPPORT_GPU
- virtual std::unique_ptr<GrFragmentProcessor> onAsFragmentProcessor(const GrFPArgs&) const;
- virtual bool onHasFragmentProcessor() const;
-#endif
-
enum FilterReturn {
kFalse_FilterReturn,
kTrue_FilterReturn,
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index b8aadec10c..fb6d47bffe 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -17,7 +17,6 @@
#if SK_SUPPORT_GPU
#include "GrTextureProxy.h"
-#include "GrFragmentProcessor.h"
#endif
SkMaskFilter::NinePatch::~NinePatch() {
@@ -302,24 +301,6 @@ 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 09739c0813..27bf09fd7c 100644
--- a/src/effects/SkRRectsGaussianEdgeMaskFilter.cpp
+++ b/src/effects/SkRRectsGaussianEdgeMaskFilter.cpp
@@ -32,17 +32,16 @@ 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;
@@ -510,10 +509,12 @@ private:
};
////////////////////////////////////////////////////////////////////////////
+bool SkRRectsGaussianEdgeMaskFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp) const {
+ if (fp) {
+ *fp = RRectsGaussianEdgeFP::Make(fFirst, fSecond, fRadius).release();
+ }
-std::unique_ptr<GrFragmentProcessor>
-SkRRectsGaussianEdgeMaskFilterImpl::onAsFragmentProcessor(const GrFPArgs& args) const {
- return RRectsGaussianEdgeFP::Make(fFirst, fSecond, fRadius);
+ return true;
}
#endif
diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp
index aff3647f6c..dcd4a99ece 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->hasFragmentProcessor()) {
+ if (mf && !mf->asFragmentProcessor(nullptr)) {
// 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 3f7dcb41e0..8d6e55c1f6 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -403,10 +403,8 @@ void SkGpuDevice::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
}
SkMaskFilter* mf = paint.getMaskFilter();
- if (mf) {
- if (mf->hasFragmentProcessor()) {
- mf = nullptr; // already handled in SkPaintToGrPaint
- }
+ if (mf && mf->asFragmentProcessor(nullptr)) {
+ mf = nullptr; // already handled in SkPaintToGrPaint
}
GrStyle style(paint);
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 9342cd676b..58dbb10df0 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -375,8 +375,6 @@ 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;
@@ -384,7 +382,8 @@ 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(fpArgs);
+ shaderFP = shader->asFragmentProcessor(GrFPArgs(
+ context, &viewM, nullptr, skPaint.getFilterQuality(), &colorSpaceInfo));
}
}
@@ -479,8 +478,9 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
SkMaskFilter* maskFilter = skPaint.getMaskFilter();
if (maskFilter) {
- if (auto mfFP = maskFilter->asFragmentProcessor(fpArgs)) {
- grPaint->addCoverageFragmentProcessor(std::move(mfFP));
+ GrFragmentProcessor* mfFP;
+ if (maskFilter->asFragmentProcessor(&mfFP)) {
+ grPaint->addCoverageFragmentProcessor(std::unique_ptr<GrFragmentProcessor>(mfFP));
}
}