xref: /aosp_15_r20/external/skia/src/gpu/ganesh/effects/GrCoverageSetOpXP.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2014 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 GrCoverageSetOpXP_DEFINED
9 #define GrCoverageSetOpXP_DEFINED
10 
11 #include "include/core/SkRefCnt.h"
12 #include "include/core/SkRegion.h"
13 #include "src/gpu/ganesh/GrCaps.h"
14 #include "src/gpu/ganesh/GrProcessorAnalysis.h"
15 #include "src/gpu/ganesh/GrProcessorUnitTest.h"
16 #include "src/gpu/ganesh/GrXferProcessor.h"
17 
18 enum class GrClampType;
19 
20 // See the comment above GrXPFactory's definition about this warning suppression.
21 #if defined(__GNUC__)
22 #pragma GCC diagnostic push
23 #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
24 #endif
25 #if defined(__clang__)
26 #pragma clang diagnostic push
27 #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
28 #endif
29 
30 /**
31  * This xfer processor directly blends the the src coverage with the dst using a set operator. It is
32  * useful for rendering coverage masks using CSG. It can optionally invert the src coverage before
33  * applying the set operator.
34  */
35 class GrCoverageSetOpXPFactory : public GrXPFactory {
36 public:
37     static const GrXPFactory* Get(SkRegion::Op regionOp, bool invertCoverage = false);
38 
39 private:
40     constexpr GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage);
41 
42     sk_sp<const GrXferProcessor> makeXferProcessor(const GrProcessorAnalysisColor&,
43                                                    GrProcessorAnalysisCoverage,
44                                                    const GrCaps&,
45                                                    GrClampType) const override;
46 
analysisProperties(const GrProcessorAnalysisColor & color,const GrProcessorAnalysisCoverage & coverage,const GrCaps &,GrClampType)47     AnalysisProperties analysisProperties(const GrProcessorAnalysisColor& color,
48                                           const GrProcessorAnalysisCoverage& coverage,
49                                           const GrCaps&,
50                                           GrClampType) const override {
51         auto props = AnalysisProperties::kIgnoresInputColor;
52         switch (fRegionOp) {
53             case SkRegion::kReplace_Op:
54                 props |= AnalysisProperties::kUnaffectedByDstValue;
55                 break;
56             case SkRegion::kUnion_Op:
57             case SkRegion::kDifference_Op:
58                 // FIXME: If we can formalize the fact that this op only operates on alpha, we can
59                 // set AnalysisProperties::kUnaffectedByDstValue if color/coverage are all opaque.
60                 break;
61             case SkRegion::kIntersect_Op:
62             case SkRegion::kXOR_Op:
63             case SkRegion::kReverseDifference_Op:
64                 break;
65         }
66         return props;
67     }
68 
69 
70     GR_DECLARE_XP_FACTORY_TEST
71 
72     SkRegion::Op fRegionOp;
73     bool         fInvertCoverage;
74 
75     using INHERITED = GrXPFactory;
76 };
77 #if defined(__GNUC__)
78 #pragma GCC diagnostic pop
79 #endif
80 #if defined(__clang__)
81 #pragma clang diagnostic pop
82 #endif
83 
84 #endif
85