| Index: src/gpu/effects/GrCustomXfermode.cpp
|
| diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp
|
| index b77bf2fad174771a22f24ae2c00db09a50fed260..c7b82be3a6ade13c92021182a40a7d5785f98ef4 100644
|
| --- a/src/gpu/effects/GrCustomXfermode.cpp
|
| +++ b/src/gpu/effects/GrCustomXfermode.cpp
|
| @@ -484,6 +484,53 @@ GrFragmentProcessor* GrCustomXferFP::TestCreate(SkRandom* rand,
|
| // Xfer Processor
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +class CustomXP : public GrXferProcessor {
|
| +public:
|
| + static GrXferProcessor* Create(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy,
|
| + bool willReadDstColor) {
|
| + if (!GrCustomXfermode::IsSupportedMode(mode)) {
|
| + return NULL;
|
| + } else {
|
| + return SkNEW_ARGS(CustomXP, (mode, dstCopy, willReadDstColor));
|
| + }
|
| + }
|
| +
|
| + ~CustomXP() SK_OVERRIDE {};
|
| +
|
| + const char* name() const SK_OVERRIDE { return "Custom Xfermode"; }
|
| +
|
| + GrGLXferProcessor* createGLInstance() const SK_OVERRIDE;
|
| +
|
| + bool hasSecondaryOutput() const SK_OVERRIDE { return false; }
|
| +
|
| + GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + bool doesStencilWrite,
|
| + GrColor* overrideColor,
|
| + const GrDrawTargetCaps& caps) SK_OVERRIDE;
|
| +
|
| + void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE {
|
| + blendInfo->fSrcBlend = kOne_GrBlendCoeff;
|
| + blendInfo->fDstBlend = kZero_GrBlendCoeff;
|
| + blendInfo->fBlendConstant = 0;
|
| + }
|
| +
|
| + SkXfermode::Mode mode() const { return fMode; }
|
| +
|
| +private:
|
| + CustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy, bool willReadDstColor);
|
| +
|
| + void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
|
| +
|
| + bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE;
|
| +
|
| + SkXfermode::Mode fMode;
|
| +
|
| + typedef GrXferProcessor INHERITED;
|
| +};
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| GrXPFactory* GrCustomXfermode::CreateXPFactory(SkXfermode::Mode mode) {
|
| if (!GrCustomXfermode::IsSupportedMode(mode)) {
|
| return NULL;
|
| @@ -502,13 +549,13 @@ public:
|
| static void GenKey(const GrXferProcessor& proc, const GrGLCaps&, GrProcessorKeyBuilder* b) {
|
| uint32_t key = proc.numTextures();
|
| SkASSERT(key <= 1);
|
| - key |= proc.cast<GrCustomXP>().mode() << 1;
|
| + key |= proc.cast<CustomXP>().mode() << 1;
|
| b->add32(key);
|
| }
|
|
|
| private:
|
| void onEmitCode(const EmitArgs& args) SK_OVERRIDE {
|
| - SkXfermode::Mode mode = args.fXP.cast<GrCustomXP>().mode();
|
| + SkXfermode::Mode mode = args.fXP.cast<CustomXP>().mode();
|
| GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
| const char* dstColor = fsBuilder->dstColor();
|
|
|
| @@ -526,26 +573,26 @@ private:
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -GrCustomXP::GrCustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy,
|
| - bool willReadDstColor)
|
| +CustomXP::CustomXP(SkXfermode::Mode mode, const GrDeviceCoordTexture* dstCopy,
|
| + bool willReadDstColor)
|
| : INHERITED(dstCopy, willReadDstColor), fMode(mode) {
|
| - this->initClassID<GrCustomXP>();
|
| + this->initClassID<CustomXP>();
|
| }
|
|
|
| -void GrCustomXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const {
|
| +void CustomXP::onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const {
|
| GLCustomXP::GenKey(*this, caps, b);
|
| }
|
|
|
| -GrGLXferProcessor* GrCustomXP::createGLInstance() const {
|
| +GrGLXferProcessor* CustomXP::createGLInstance() const {
|
| return SkNEW_ARGS(GLCustomXP, (*this));
|
| }
|
|
|
| -bool GrCustomXP::onIsEqual(const GrXferProcessor& other) const {
|
| - const GrCustomXP& s = other.cast<GrCustomXP>();
|
| +bool CustomXP::onIsEqual(const GrXferProcessor& other) const {
|
| + const CustomXP& s = other.cast<CustomXP>();
|
| return fMode == s.fMode;
|
| }
|
|
|
| -GrXferProcessor::OptFlags GrCustomXP::getOptimizations(const GrProcOptInfo& colorPOI,
|
| +GrXferProcessor::OptFlags CustomXP::getOptimizations(const GrProcOptInfo& colorPOI,
|
| const GrProcOptInfo& coveragePOI,
|
| bool doesStencilWrite,
|
| GrColor* overrideColor,
|
| @@ -560,6 +607,14 @@ GrCustomXPFactory::GrCustomXPFactory(SkXfermode::Mode mode)
|
| this->initClassID<GrCustomXPFactory>();
|
| }
|
|
|
| +GrXferProcessor*
|
| +GrCustomXPFactory::onCreateXferProcessor(const GrProcOptInfo& colorPOI,
|
| + const GrProcOptInfo& coveragePOI,
|
| + const GrDeviceCoordTexture* dstCopy) const {
|
| + return CustomXP::Create(fMode, dstCopy, this->willReadDstColor());
|
| +}
|
| +
|
| +
|
| void GrCustomXPFactory::getInvariantOutput(const GrProcOptInfo& colorPOI,
|
| const GrProcOptInfo& coveragePOI,
|
| GrXPFactory::InvariantOutput* output) const {
|
|
|