9435b845d4635fd8647dc2e17fb560de82723734
[platform/upstream/libSkiaSharp.git] / include / gpu / effects / GrCoverageSetOpXP.h
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 "GrTypes.h"
12 #include "GrXferProcessor.h"
13 #include "SkRegion.h"
14
15 class GrProcOptInfo;
16
17 /**
18  * This xfer processor directly blends the the src coverage with the dst using a set operator. It is
19  * useful for rendering coverage masks using CSG. It can optionally invert the src coverage before
20  * applying the set operator.
21  */
22 class GrCoverageSetOpXPFactory : public GrXPFactory {
23 public:
24     static GrXPFactory* Create(SkRegion::Op regionOp, bool invertCoverage = false);
25
26     bool supportsRGBCoverage(GrColor /*knownColor*/,
27                              uint32_t /*knownColorFlags*/) const SK_OVERRIDE {
28         return true;
29     }
30
31     bool canTweakAlphaForCoverage() const SK_OVERRIDE { return false; }
32
33     void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
34                             GrXPFactory::InvariantOutput*) const SK_OVERRIDE;
35
36 private:
37     GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage);
38
39     GrXferProcessor* onCreateXferProcessor(const GrDrawTargetCaps& caps,
40                                            const GrProcOptInfo& colorPOI,
41                                            const GrProcOptInfo& coveragePOI,
42                                            const GrDeviceCoordTexture* dstCopy) const SK_OVERRIDE;
43
44     bool willReadDstColor(const GrDrawTargetCaps& /*caps*/,
45                           const GrProcOptInfo& /*colorPOI*/,
46                           const GrProcOptInfo& /*coveragePOI*/) const SK_OVERRIDE {
47         return false;
48     }
49
50     bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE {
51         const GrCoverageSetOpXPFactory& xpf = xpfBase.cast<GrCoverageSetOpXPFactory>();
52         return fRegionOp == xpf.fRegionOp;
53     }
54
55     GR_DECLARE_XP_FACTORY_TEST;
56
57     SkRegion::Op fRegionOp;
58     bool         fInvertCoverage;
59
60     typedef GrXPFactory INHERITED;
61 };
62 #endif
63