blob: 289b5cf307f559aafde226dc2f4d20e58b961086 [file] [log] [blame]
egdaniel87509242014-12-17 13:37:13 -08001/*
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
egdaniel87509242014-12-17 13:37:13 -080015class 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 GrCoverageSetOpXP : public GrXferProcessor {
23public:
24 static GrXferProcessor* Create(SkRegion::Op regionOp, bool invertCoverage) {
25 return SkNEW_ARGS(GrCoverageSetOpXP, (regionOp, invertCoverage));
26 }
27
28 ~GrCoverageSetOpXP() SK_OVERRIDE;
29
egdaniel080e6732014-12-22 07:35:52 -080030 const char* name() const SK_OVERRIDE { return "Coverage Set Op"; }
egdaniel87509242014-12-17 13:37:13 -080031
32 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
33
34 GrGLXferProcessor* createGLInstance() const SK_OVERRIDE;
35
36 bool hasSecondaryOutput() const SK_OVERRIDE { return false; }
37
38 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI,
39 const GrProcOptInfo& coveragePOI,
egdaniel87509242014-12-17 13:37:13 -080040 bool doesStencilWrite,
41 GrColor* color,
42 const GrDrawTargetCaps& caps) SK_OVERRIDE;
43
44 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE;
45
46 bool invertCoverage() const { return fInvertCoverage; }
47
48private:
49 GrCoverageSetOpXP(SkRegion::Op regionOp, bool fInvertCoverage);
50
51 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE {
52 const GrCoverageSetOpXP& xp = xpBase.cast<GrCoverageSetOpXP>();
53 return (fRegionOp == xp.fRegionOp &&
54 fInvertCoverage == xp.fInvertCoverage);
55 }
56
57 SkRegion::Op fRegionOp;
58 bool fInvertCoverage;
59
60 typedef GrXferProcessor INHERITED;
61};
62
63///////////////////////////////////////////////////////////////////////////////
64
65class GrCoverageSetOpXPFactory : public GrXPFactory {
66public:
67 static GrXPFactory* Create(SkRegion::Op regionOp, bool invertCoverage = false);
68
69 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI,
70 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE;
71
72 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const SK_OVERRIDE {
73 return true;
74 }
75
egdaniel080e6732014-12-22 07:35:52 -080076 bool canApplyCoverage(const GrProcOptInfo& colorPOI,
77 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE {
egdaniel87509242014-12-17 13:37:13 -080078 return true;
79 }
80
egdaniel87509242014-12-17 13:37:13 -080081 bool canTweakAlphaForCoverage() const SK_OVERRIDE { return false; }
82
egdaniel9e4ecdc2014-12-18 12:44:55 -080083 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
egdaniel9e4ecdc2014-12-18 12:44:55 -080084 GrXPFactory::InvariantOutput*) const SK_OVERRIDE;
egdaniel87509242014-12-17 13:37:13 -080085
egdaniel080e6732014-12-22 07:35:52 -080086 bool willReadDst(const GrProcOptInfo& colorPOI,
87 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE;
88
egdaniel87509242014-12-17 13:37:13 -080089private:
90 GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage);
91
92 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE {
93 const GrCoverageSetOpXPFactory& xpf = xpfBase.cast<GrCoverageSetOpXPFactory>();
94 return fRegionOp == xpf.fRegionOp;
95 }
96
97 GR_DECLARE_XP_FACTORY_TEST;
98
99 SkRegion::Op fRegionOp;
100 bool fInvertCoverage;
101
102 typedef GrXPFactory INHERITED;
103};
104#endif
105