Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2017 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrBlurredEdgeFragmentProcessor_DEFINED
      9 #define GrBlurredEdgeFragmentProcessor_DEFINED
     10 
     11 #include "GrFragmentProcessor.h"
     12 
     13 /**
     14  * Shader for managing a blurred edge for a shadow.
     15  *
     16  * There are two blurring modes supported: Gaussian blur function and smoothstep function.
     17  *
     18  * If the primitive supports an implicit distance to the edge, the radius of the blur is specified
     19  * by r & g values of the color in 14.2 fixed point. For spot shadows, we increase the stroke width
     20  * to set the shadow against the shape. This pad is specified by b, also in 6.2 fixed point.
     21  * The a value represents the max final alpha.
     22  *
     23  * When not using implicit distance, then b in the input color represents the input to the
     24  * blur function, and r the max final alpha.
     25  *
     26  */
     27 class GrBlurredEdgeFP : public GrFragmentProcessor {
     28 public:
     29     enum Mode {
     30         kGaussian_Mode,
     31         kSmoothstep_Mode,
     32 
     33         kLastMode = kSmoothstep_Mode
     34     };
     35     static const int kModeCnt = kLastMode + 1;
     36 
     37     static sk_sp<GrFragmentProcessor> Make(Mode mode = kGaussian_Mode) {
     38         return sk_sp<GrFragmentProcessor>(new GrBlurredEdgeFP(mode));
     39     }
     40 
     41     const char* name() const override { return "BlurredEdge"; }
     42 
     43     Mode mode() const { return fMode; }
     44 
     45 private:
     46     GrBlurredEdgeFP(Mode mode)
     47         : INHERITED(kNone_OptimizationFlags)
     48         , fMode(mode) {
     49         // enable output of distance information for shape
     50         this->setWillUseDistanceVectorField();
     51 
     52         this->initClassID<GrBlurredEdgeFP>();
     53     }
     54 
     55     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
     56 
     57     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     58 
     59     bool onIsEqual(const GrFragmentProcessor&) const override;
     60 
     61     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
     62 
     63     Mode   fMode;
     64 
     65     typedef GrFragmentProcessor INHERITED;
     66 };
     67 
     68 #endif
     69