GrCoverageSetOpXP.h revision b197b8ff31b73ccb20423023e03592df8ae78ea6
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
15class 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 */
22class GrCoverageSetOpXPFactory : public GrXPFactory {
23public:
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 canApplyCoverage(const GrProcOptInfo& /*colorPOI*/,
32                          const GrProcOptInfo& /*coveragePOI*/) const SK_OVERRIDE {
33        return true;
34    }
35
36    bool canTweakAlphaForCoverage() const SK_OVERRIDE { return false; }
37
38    void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
39                            GrXPFactory::InvariantOutput*) const SK_OVERRIDE;
40
41private:
42    GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage);
43
44    GrXferProcessor* onCreateXferProcessor(const GrProcOptInfo& colorPOI,
45                                           const GrProcOptInfo& coveragePOI,
46                                           const GrDeviceCoordTexture* dstCopy) const SK_OVERRIDE;
47
48    bool willReadDstColor(const GrProcOptInfo& /*colorPOI*/,
49                          const GrProcOptInfo& /*coveragePOI*/) const SK_OVERRIDE {
50        return false;
51    }
52
53    bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE {
54        const GrCoverageSetOpXPFactory& xpf = xpfBase.cast<GrCoverageSetOpXPFactory>();
55        return fRegionOp == xpf.fRegionOp;
56    }
57
58    GR_DECLARE_XP_FACTORY_TEST;
59
60    SkRegion::Op fRegionOp;
61    bool         fInvertCoverage;
62
63    typedef GrXPFactory INHERITED;
64};
65#endif
66
67