From 91af72703830f3946c538b47c6c7c96afc0adde2 Mon Sep 17 00:00:00 2001 From: Jim Van Verth Date: Fri, 27 Jan 2017 14:15:54 -0500 Subject: Add geometric version of spot shadow BUG=skia:6119 Change-Id: Ib9770bd88f4eebd68f2d893c5788f966d89f193c Reviewed-on: https://skia-review.googlesource.com/7585 Reviewed-by: Brian Salomon Commit-Queue: Jim Van Verth --- .../gpu/effects/GrBlurredEdgeFragmentProcessor.h | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 include/gpu/effects/GrBlurredEdgeFragmentProcessor.h (limited to 'include/gpu/effects') diff --git a/include/gpu/effects/GrBlurredEdgeFragmentProcessor.h b/include/gpu/effects/GrBlurredEdgeFragmentProcessor.h new file mode 100755 index 0000000000..2e52485791 --- /dev/null +++ b/include/gpu/effects/GrBlurredEdgeFragmentProcessor.h @@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrBlurredEdgeFragmentProcessor_DEFINED +#define GrBlurredEdgeFragmentProcessor_DEFINED + +#include "GrFragmentProcessor.h" + +/** + * Shader for managing a blurred edge for a shadow. + * + * There are two blurring modes supported: Gaussian blur function and smoothstep function. + * + * If the primitive supports an implicit distance to the edge, the radius of the blur is specified + * by r & g values of the color in 14.2 fixed point. For spot shadows, we increase the stroke width + * to set the shadow against the shape. This pad is specified by b, also in 6.2 fixed point. + * + * When not using implicit distance, then b in the input color represents the input to the + * blur function. + * + * In either case, the a value represents the max final alpha. + */ +class GrBlurredEdgeFP : public GrFragmentProcessor { +public: + enum Mode { + kGaussian_Mode, + kSmoothstep_Mode, + + kLastMode = kSmoothstep_Mode + }; + static const int kModeCnt = kLastMode + 1; + + static sk_sp Make(Mode mode = kGaussian_Mode) { + return sk_sp(new GrBlurredEdgeFP(mode)); + } + + const char* name() const override { return "BlurredEdge"; } + + Mode mode() const { return fMode; } + +private: + GrBlurredEdgeFP(Mode mode) + : INHERITED(kNone_OptimizationFlags) + , fMode(mode) { + // enable output of distance information for shape + this->setWillUseDistanceVectorField(); + + this->initClassID(); + } + + GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; + + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; + + bool onIsEqual(const GrFragmentProcessor&) const override; + + void onComputeInvariantOutput(GrInvariantOutput* inout) const override; + + GR_DECLARE_FRAGMENT_PROCESSOR_TEST; + + Mode fMode; + + typedef GrFragmentProcessor INHERITED; +}; + +#endif -- cgit v1.2.3