xref: /aosp_15_r20/external/skia/src/gpu/ganesh/effects/GrModulateAtlasCoverageEffect.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2021 Google LLC.
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 GrGrModulateAtlasCoverageEffect_DEFINED
9 #define GrGrModulateAtlasCoverageEffect_DEFINED
10 
11 #include "include/core/SkRect.h"
12 #include "include/private/base/SkMacros.h"
13 #include "src/gpu/ganesh/GrFragmentProcessor.h"
14 
15 #include <memory>
16 
17 class GrSurfaceProxyView;
18 class SkMatrix;
19 namespace skgpu { class KeyBuilder; }
20 struct GrShaderCaps;
21 
22 // Multiplies 'inputFP' by the coverage value in an atlas, optionally inverting or clamping to 0.
23 class GrModulateAtlasCoverageEffect : public GrFragmentProcessor {
24 public:
25     enum class Flags {
26         kNone = 0,
27         kInvertCoverage = 1 << 0,  // Return inputColor * (1 - atlasCoverage).
28         kCheckBounds = 1 << 1  // Clamp atlasCoverage to 0 if outside the path's valid atlas bounds.
29     };
30 
31     SK_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags);
32 
33     GrModulateAtlasCoverageEffect(Flags flags, std::unique_ptr<GrFragmentProcessor> inputFP,
34                                   GrSurfaceProxyView atlasView, const SkMatrix& devToAtlasMatrix,
35                                   const SkIRect& devIBounds);
36 
37     GrModulateAtlasCoverageEffect(const GrModulateAtlasCoverageEffect& that);
38 
name()39     const char* name() const override {
40         return "GrModulateAtlasCoverageFP";
41     }
42 
clone()43     std::unique_ptr<GrFragmentProcessor> clone() const override {
44         return std::make_unique<GrModulateAtlasCoverageEffect>(*this);
45     }
46 
47 private:
48     void onAddToKey(const GrShaderCaps&, skgpu::KeyBuilder* b) const override;
49 
onIsEqual(const GrFragmentProcessor & that)50     bool onIsEqual(const GrFragmentProcessor& that) const override {
51         auto fp = that.cast<GrModulateAtlasCoverageEffect>();
52         return fFlags == fp.fFlags && fBounds == fp.fBounds;
53     }
54     std::unique_ptr<ProgramImpl> onMakeProgramImpl() const override;
55 
56     const Flags fFlags;
57     const SkIRect fBounds;
58 };
59 
60 SK_MAKE_BITFIELD_CLASS_OPS(GrModulateAtlasCoverageEffect::Flags)
61 
62 #endif
63