| Index: src/gpu/effects/GrCoverageSetOpXP.cpp
|
| diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp
|
| index 7025d20395f2af1b71327506e6b64bbc50756178..f0ec1f9b00b4d7c74ce4431cb6dd551ab54c811e 100644
|
| --- a/src/gpu/effects/GrCoverageSetOpXP.cpp
|
| +++ b/src/gpu/effects/GrCoverageSetOpXP.cpp
|
| @@ -15,22 +15,70 @@
|
| #include "gl/builders/GrGLFragmentShaderBuilder.h"
|
| #include "gl/builders/GrGLProgramBuilder.h"
|
|
|
| -class GrGLCoverageSetOpXP : public GrGLXferProcessor {
|
| +/**
|
| + * This xfer processor directly blends the the src coverage with the dst using a set operator. It is
|
| + * useful for rendering coverage masks using CSG. It can optionally invert the src coverage before
|
| + * applying the set operator.
|
| + * */
|
| +class CoverageSetOpXP : public GrXferProcessor {
|
| public:
|
| - GrGLCoverageSetOpXP(const GrProcessor&) {}
|
| + static GrXferProcessor* Create(SkRegion::Op regionOp, bool invertCoverage) {
|
| + return SkNEW_ARGS(CoverageSetOpXP, (regionOp, invertCoverage));
|
| + }
|
| +
|
| + ~CoverageSetOpXP() SK_OVERRIDE;
|
| +
|
| + const char* name() const SK_OVERRIDE { return "Coverage Set Op"; }
|
| +
|
| + GrGLXferProcessor* createGLInstance() const SK_OVERRIDE;
|
| +
|
| + bool hasSecondaryOutput() const SK_OVERRIDE { return false; }
|
| +
|
| + GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + bool doesStencilWrite,
|
| + GrColor* color,
|
| + const GrDrawTargetCaps& caps) SK_OVERRIDE;
|
| +
|
| + void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE;
|
| +
|
| + bool invertCoverage() const { return fInvertCoverage; }
|
| +
|
| +private:
|
| + CoverageSetOpXP(SkRegion::Op regionOp, bool fInvertCoverage);
|
| +
|
| + void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
|
| +
|
| + bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE {
|
| + const CoverageSetOpXP& xp = xpBase.cast<CoverageSetOpXP>();
|
| + return (fRegionOp == xp.fRegionOp &&
|
| + fInvertCoverage == xp.fInvertCoverage);
|
| + }
|
| +
|
| + SkRegion::Op fRegionOp;
|
| + bool fInvertCoverage;
|
| +
|
| + typedef GrXferProcessor INHERITED;
|
| +};
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +class GLCoverageSetOpXP : public GrGLXferProcessor {
|
| +public:
|
| + GLCoverageSetOpXP(const GrProcessor&) {}
|
|
|
| - ~GrGLCoverageSetOpXP() SK_OVERRIDE {}
|
| + ~GLCoverageSetOpXP() SK_OVERRIDE {}
|
|
|
| static void GenKey(const GrProcessor& processor, const GrGLCaps& caps,
|
| GrProcessorKeyBuilder* b) {
|
| - const GrCoverageSetOpXP& xp = processor.cast<GrCoverageSetOpXP>();
|
| + const CoverageSetOpXP& xp = processor.cast<CoverageSetOpXP>();
|
| uint32_t key = xp.invertCoverage() ? 0x0 : 0x1;
|
| b->add32(key);
|
| };
|
|
|
| private:
|
| void onEmitCode(const EmitArgs& args) SK_OVERRIDE {
|
| - const GrCoverageSetOpXP& xp = args.fXP.cast<GrCoverageSetOpXP>();
|
| + const CoverageSetOpXP& xp = args.fXP.cast<CoverageSetOpXP>();
|
| GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
|
|
| if (xp.invertCoverage()) {
|
| @@ -47,34 +95,34 @@ private:
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -GrCoverageSetOpXP::GrCoverageSetOpXP(SkRegion::Op regionOp, bool invertCoverage)
|
| +CoverageSetOpXP::CoverageSetOpXP(SkRegion::Op regionOp, bool invertCoverage)
|
| : fRegionOp(regionOp)
|
| , fInvertCoverage(invertCoverage) {
|
| - this->initClassID<GrCoverageSetOpXP>();
|
| + this->initClassID<CoverageSetOpXP>();
|
| }
|
|
|
| -GrCoverageSetOpXP::~GrCoverageSetOpXP() {
|
| +CoverageSetOpXP::~CoverageSetOpXP() {
|
| }
|
|
|
| -void GrCoverageSetOpXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const {
|
| - GrGLCoverageSetOpXP::GenKey(*this, caps, b);
|
| +void CoverageSetOpXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const {
|
| + GLCoverageSetOpXP::GenKey(*this, caps, b);
|
| }
|
|
|
| -GrGLXferProcessor* GrCoverageSetOpXP::createGLInstance() const {
|
| - return SkNEW_ARGS(GrGLCoverageSetOpXP, (*this));
|
| +GrGLXferProcessor* CoverageSetOpXP::createGLInstance() const {
|
| + return SkNEW_ARGS(GLCoverageSetOpXP, (*this));
|
| }
|
|
|
| GrXferProcessor::OptFlags
|
| -GrCoverageSetOpXP::getOptimizations(const GrProcOptInfo& colorPOI,
|
| - const GrProcOptInfo& coveragePOI,
|
| - bool doesStencilWrite,
|
| - GrColor* color,
|
| - const GrDrawTargetCaps& caps) {
|
| +CoverageSetOpXP::getOptimizations(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + bool doesStencilWrite,
|
| + GrColor* color,
|
| + const GrDrawTargetCaps& caps) {
|
| // We never look at the color input
|
| return GrXferProcessor::kIgnoreColor_OptFlag;
|
| }
|
|
|
| -void GrCoverageSetOpXP::getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const {
|
| +void CoverageSetOpXP::getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const {
|
| switch (fRegionOp) {
|
| case SkRegion::kReplace_Op:
|
| blendInfo->fSrcBlend = kOne_GrBlendCoeff;
|
| @@ -183,7 +231,7 @@ GrXferProcessor*
|
| GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrProcOptInfo& colorPOI,
|
| const GrProcOptInfo& covPOI,
|
| const GrDeviceCoordTexture* dstCopy) const {
|
| - return GrCoverageSetOpXP::Create(fRegionOp, fInvertCoverage);
|
| + return CoverageSetOpXP::Create(fRegionOp, fInvertCoverage);
|
| }
|
|
|
| void GrCoverageSetOpXPFactory::getInvariantOutput(const GrProcOptInfo& colorPOI,
|
|
|