diff options
-rw-r--r-- | gm/shadermaskfilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkShaderMaskFilter.cpp | 21 | ||||
-rw-r--r-- | src/gpu/GrFragmentProcessor.cpp | 10 | ||||
-rw-r--r-- | src/gpu/GrFragmentProcessor.h | 13 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 2 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 2 | ||||
-rw-r--r-- | src/shaders/SkImageShader.cpp | 2 | ||||
-rw-r--r-- | src/shaders/SkPerlinNoiseShader.cpp | 4 | ||||
-rw-r--r-- | src/shaders/gradients/SkGradientShaderPriv.h | 2 |
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 |