blob: 2f4530c300ad55e667a07c4081f10319a50ed6d6 [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
egdanielb197b8f2015-02-17 07:34:43 -080017/**
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 */
egdaniel87509242014-12-17 13:37:13 -080022class GrCoverageSetOpXPFactory : public GrXPFactory {
23public:
24 static GrXPFactory* Create(SkRegion::Op regionOp, bool invertCoverage = false);
25
egdanielb197b8f2015-02-17 07:34:43 -080026 bool supportsRGBCoverage(GrColor /*knownColor*/,
mtklein36352bf2015-03-25 18:17:31 -070027 uint32_t /*knownColorFlags*/) const override {
egdaniel87509242014-12-17 13:37:13 -080028 return true;
29 }
30
egdaniel9e4ecdc2014-12-18 12:44:55 -080031 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
mtklein36352bf2015-03-25 18:17:31 -070032 GrXPFactory::InvariantOutput*) const override;
egdaniel87509242014-12-17 13:37:13 -080033
egdaniel87509242014-12-17 13:37:13 -080034private:
35 GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage);
36
bsalomon4b91f762015-05-19 09:29:46 -070037 GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
egdaniel3ad65702015-02-17 11:15:47 -080038 const GrProcOptInfo& colorPOI,
bsalomon50785a32015-02-06 07:02:37 -080039 const GrProcOptInfo& coveragePOI,
bsalomon6a44c6a2015-05-26 09:49:05 -070040 const DstTexture*) const override;
bsalomon50785a32015-02-06 07:02:37 -080041
bsalomon4b91f762015-05-19 09:29:46 -070042 bool willReadDstColor(const GrCaps& /*caps*/,
egdaniel3ad65702015-02-17 11:15:47 -080043 const GrProcOptInfo& /*colorPOI*/,
mtklein36352bf2015-03-25 18:17:31 -070044 const GrProcOptInfo& /*coveragePOI*/) const override {
egdaniele36914c2015-02-13 09:00:33 -080045 return false;
46 }
bsalomon50785a32015-02-06 07:02:37 -080047
mtklein36352bf2015-03-25 18:17:31 -070048 bool onIsEqual(const GrXPFactory& xpfBase) const override {
egdaniel87509242014-12-17 13:37:13 -080049 const GrCoverageSetOpXPFactory& xpf = xpfBase.cast<GrCoverageSetOpXPFactory>();
50 return fRegionOp == xpf.fRegionOp;
51 }
52
53 GR_DECLARE_XP_FACTORY_TEST;
54
55 SkRegion::Op fRegionOp;
56 bool fInvertCoverage;
57
58 typedef GrXPFactory INHERITED;
59};
60#endif
61