blob: 2aae7be41d7633e0449846a037e3c1ce89dc2a8a [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:
bungeman06ca8ec2016-06-09 08:01:03 -070024 static sk_sp<GrXPFactory> Make(SkRegion::Op regionOp, bool invertCoverage = false);
egdaniel87509242014-12-17 13:37:13 -080025
cdalton1fa45722015-06-02 10:43:39 -070026 void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
27 GrXPFactory::InvariantBlendedColor*) const override;
egdaniel87509242014-12-17 13:37:13 -080028
egdaniel87509242014-12-17 13:37:13 -080029private:
30 GrCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage);
31
Brian Salomon92aee3d2016-12-21 09:20:25 -050032 GrXferProcessor* onCreateXferProcessor(const GrCaps&,
33 const GrPipelineAnalysis&,
cdalton86ae0a92015-06-08 15:11:04 -070034 bool hasMixedSamples,
bsalomon6a44c6a2015-05-26 09:49:05 -070035 const DstTexture*) const override;
bsalomon50785a32015-02-06 07:02:37 -080036
Brian Salomon92aee3d2016-12-21 09:20:25 -050037 bool onWillReadDstColor(const GrCaps&, const GrPipelineAnalysis&) const override {
egdaniele36914c2015-02-13 09:00:33 -080038 return false;
39 }
bsalomon50785a32015-02-06 07:02:37 -080040
mtklein36352bf2015-03-25 18:17:31 -070041 bool onIsEqual(const GrXPFactory& xpfBase) const override {
egdaniel87509242014-12-17 13:37:13 -080042 const GrCoverageSetOpXPFactory& xpf = xpfBase.cast<GrCoverageSetOpXPFactory>();
43 return fRegionOp == xpf.fRegionOp;
44 }
45
46 GR_DECLARE_XP_FACTORY_TEST;
47
48 SkRegion::Op fRegionOp;
49 bool fInvertCoverage;
50
51 typedef GrXPFactory INHERITED;
52};
53#endif
54