aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/shadermaskfilter.cpp2
-rw-r--r--src/effects/SkShaderMaskFilter.cpp21
-rw-r--r--src/gpu/GrFragmentProcessor.cpp10
-rw-r--r--src/gpu/GrFragmentProcessor.h13
-rw-r--r--src/gpu/SkGpuDevice.cpp2
-rw-r--r--src/gpu/SkGr.cpp2
-rw-r--r--src/shaders/SkImageShader.cpp2
-rw-r--r--src/shaders/SkPerlinNoiseShader.cpp4
-rw-r--r--src/shaders/gradients/SkGradientShaderPriv.h2
9 files changed, 48 insertions, 10 deletions
diff --git a/gm/shadermaskfilter.cpp b/gm/shadermaskfilter.cpp
index 8011b45d41..73a9cda65f 100644
--- a/gm/shadermaskfilter.cpp
+++ b/gm/shadermaskfilter.cpp
@@ -22,6 +22,7 @@ static void draw_masked_image(SkCanvas* canvas, const SkImage* image, SkScalar x
mf = SkMaskFilter::MakeCompose(outer, mf);
}
paint.setMaskFilter(mf);
+ paint.setAntiAlias(true);
canvas->drawImage(image, x, y, &paint);
}
@@ -45,6 +46,7 @@ DEF_SIMPLE_GM(shadermaskfilter_gradient, canvas, 512, 512) {
SkPaint paint;
paint.setMaskFilter(mf);
paint.setColor(SK_ColorRED);
+ paint.setAntiAlias(true);
canvas->drawOval(r, paint);
}
diff --git a/src/effects/SkShaderMaskFilter.cpp b/src/effects/SkShaderMaskFilter.cpp
index f2088fce72..74352acb65 100644
--- a/src/effects/SkShaderMaskFilter.cpp
+++ b/src/effects/SkShaderMaskFilter.cpp
@@ -9,7 +9,7 @@
#include "SkMaskFilterBase.h"
#include "SkReadBuffer.h"
#include "SkShaderMaskFilter.h"
-#include "SkShader.h"
+#include "SkShaderBase.h"
#include "SkString.h"
class SkShaderMF : public SkMaskFilterBase {
@@ -30,6 +30,12 @@ public:
SK_TO_STRING_OVERRIDE()
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkShaderMF)
+protected:
+#if SK_SUPPORT_GPU
+ std::unique_ptr<GrFragmentProcessor> onAsFragmentProcessor(const GrFPArgs&) const override;
+ bool onHasFragmentProcessor() const override;
+#endif
+
private:
sk_sp<SkShader> fShader;
@@ -108,6 +114,19 @@ bool SkShaderMF::filterMask(SkMask* dst, const SkMask& src, const SkMatrix& ctm,
}
///////////////////////////////////////////////////////////////////////////////////////////////////
+#if SK_SUPPORT_GPU
+#include "GrFragmentProcessor.h"
+
+std::unique_ptr<GrFragmentProcessor> SkShaderMF::onAsFragmentProcessor(const GrFPArgs& args) const {
+ return GrFragmentProcessor::MulInputByChildAlpha(as_SB(fShader)->asFragmentProcessor(args));
+}
+
+bool SkShaderMF::onHasFragmentProcessor() const {
+ return true;
+}
+
+#endif
+///////////////////////////////////////////////////////////////////////////////////////////////////
sk_sp<SkMaskFilter> SkShaderMaskFilter::Make(sk_sp<SkShader> shader) {
return shader ? sk_sp<SkMaskFilter>(new SkShaderMF(std::move(shader))) : nullptr;
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index 0c7c06fd6a..187a17701d 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -103,7 +103,7 @@ bool GrFragmentProcessor::hasSameTransforms(const GrFragmentProcessor& that) con
return true;
}
-std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputAlpha(
+std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::MulChildByInputAlpha(
std::unique_ptr<GrFragmentProcessor> fp) {
if (!fp) {
return nullptr;
@@ -111,6 +111,14 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputAlpha(
return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp), SkBlendMode::kDstIn);
}
+std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::MulInputByChildAlpha(
+ std::unique_ptr<GrFragmentProcessor> fp) {
+ if (!fp) {
+ return nullptr;
+ }
+ return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp), SkBlendMode::kSrcIn);
+}
+
std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::PremulInput(
std::unique_ptr<GrFragmentProcessor> fp) {
if (!fp) {
diff --git a/src/gpu/GrFragmentProcessor.h b/src/gpu/GrFragmentProcessor.h
index 4ec92627ad..fa674d5d80 100644
--- a/src/gpu/GrFragmentProcessor.h
+++ b/src/gpu/GrFragmentProcessor.h
@@ -33,8 +33,17 @@ public:
* does so by returning a parent FP that multiplies the passed in FPs output by the parent's
* input alpha. The passed in FP will not receive an input color.
*/
- static std::unique_ptr<GrFragmentProcessor> MulOutputByInputAlpha(
- std::unique_ptr<GrFragmentProcessor>);
+ static std::unique_ptr<GrFragmentProcessor> MulChildByInputAlpha(
+ std::unique_ptr<GrFragmentProcessor> child);
+
+ /**
+ * Like MulChildByInputAlpha(), but reverses the sense of src and dst. In this case, return
+ * the input modulated by the child's alpha. The passed in FP will not receive an input color.
+ *
+ * output = input * child.a
+ */
+ static std::unique_ptr<GrFragmentProcessor> MulInputByChildAlpha(
+ std::unique_ptr<GrFragmentProcessor> child);
/**
* This assumes that the input color to the returned processor will be unpremul and that the
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 080d993c68..73e5f11e4a 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1094,7 +1094,7 @@ void SkGpuDevice::drawSpecial(SkSpecialImage* special1, int left, int top, const
if (GrPixelConfigIsAlphaOnly(config)) {
fp = GrFragmentProcessor::MakeInputPremulAndMulByOutput(std::move(fp));
} else {
- fp = GrFragmentProcessor::MulOutputByInputAlpha(std::move(fp));
+ fp = GrFragmentProcessor::MulChildByInputAlpha(std::move(fp));
}
GrPaint grPaint;
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index a702d06395..af0579a098 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -576,7 +576,7 @@ bool SkPaintToGrPaintWithTexture(GrContext* context,
shaderFP = GrFragmentProcessor::MakeInputPremulAndMulByOutput(std::move(fp));
}
} else {
- shaderFP = GrFragmentProcessor::MulOutputByInputAlpha(std::move(fp));
+ shaderFP = GrFragmentProcessor::MulChildByInputAlpha(std::move(fp));
}
return SkPaintToGrPaintReplaceShader(context, colorSpaceInfo, paint, std::move(shaderFP),
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 4ca6cd9d8f..4eaeae2d28 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -234,7 +234,7 @@ std::unique_ptr<GrFragmentProcessor> SkImageShader::asFragmentProcessor(
if (isAlphaOnly) {
return inner;
}
- return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
+ return GrFragmentProcessor::MulChildByInputAlpha(std::move(inner));
}
#endif
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index 48c9c30447..5979a9b4b0 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -1434,7 +1434,7 @@ std::unique_ptr<GrFragmentProcessor> SkPerlinNoiseShaderImpl::asFragmentProcesso
auto inner =
GrConstColorProcessor::Make(GrColor4f::FromGrColor(0x80404040),
GrConstColorProcessor::InputMode::kModulateRGBA);
- return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
+ return GrFragmentProcessor::MulChildByInputAlpha(std::move(inner));
}
// Emit zero.
return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(),
@@ -1456,7 +1456,7 @@ std::unique_ptr<GrFragmentProcessor> SkPerlinNoiseShaderImpl::asFragmentProcesso
std::move(permutationsProxy),
std::move(noiseProxy),
m);
- return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
+ return GrFragmentProcessor::MulChildByInputAlpha(std::move(inner));
}
return nullptr;
}
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index 53411b2d17..d71ba0295d 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -280,7 +280,7 @@ protected:
} else {
fp = std::move(gradientFP);
}
- return GrFragmentProcessor::MulOutputByInputAlpha(std::move(fp));
+ return GrFragmentProcessor::MulChildByInputAlpha(std::move(fp));
}
#if GR_TEST_UTILS