text: /*
   * Copyright 2021 Google LLC.
   *
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  
  #ifndef GrGrModulateAtlasCoverageEffect_DEFINED
  #define GrGrModulateAtlasCoverageEffect_DEFINED
  
  #include "src/gpu/GrFragmentProcessor.h"
  
  // Multiplies 'inputFP' by the coverage value in an atlas, optionally inverting or clamping to 0.
  class GrModulateAtlasCoverageEffect : public GrFragmentProcessor {
  public:
      enum class Flags {
          kNone = 0,
          kInvertCoverage = 1 << 0,  // Return inputColor * (1 - atlasCoverage).
          kCheckBounds = 1 << 1  // Clamp atlasCoverage to 0 if outside the path's valid atlas bounds.
      };
  
      GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags);
  
      GrModulateAtlasCoverageEffect(Flags flags, std::unique_ptr<GrFragmentProcessor> inputFP,
                                    GrSurfaceProxyView atlasView, const SkMatrix& devToAtlasMatrix,
                                    const SkIRect& devIBounds);
  
      GrModulateAtlasCoverageEffect(const GrModulateAtlasCoverageEffect& that);
  
      const char* name() const override {
          return "GrModulateAtlasCoverageFP";
      }
  
      std::unique_ptr<GrFragmentProcessor> clone() const override {
          return std::make_unique<GrModulateAtlasCoverageEffect>(*this);
      }
  
  private:
      void onAddToKey(const GrShaderCaps&, skgpu::KeyBuilder* b) const override;
  
      bool onIsEqual(const GrFragmentProcessor& that) const override {
          auto fp = that.cast<GrModulateAtlasCoverageEffect>();
          return fFlags == fp.fFlags && fBounds == fp.fBounds;
      }
      std::unique_ptr<ProgramImpl> onMakeProgramImpl() const override;
  
      const Flags fFlags;
      const SkIRect fBounds;
  };
  
  GR_MAKE_BITFIELD_CLASS_OPS(GrModulateAtlasCoverageEffect::Flags)
  
  #endif
  