| Index: src/gpu/GrXferProcessor.cpp | 
| diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..e98ae407a8458b993785c7a613e32817e86ead47 | 
| --- /dev/null | 
| +++ b/src/gpu/GrXferProcessor.cpp | 
| @@ -0,0 +1,58 @@ | 
| +/* | 
| + * Copyright 2015 Google Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include "GrXferProcessor.h" | 
| +#include "gl/GrGLCaps.h" | 
| + | 
| +GrXferProcessor::GrXferProcessor() : fWillReadDstColor(false), fDstCopyTextureOffset() { | 
| +} | 
| + | 
| +GrXferProcessor::GrXferProcessor(const GrDeviceCoordTexture* dstCopy, bool willReadDstColor) | 
| +    : fWillReadDstColor(willReadDstColor) | 
| +    , fDstCopyTextureOffset() { | 
| +    if (dstCopy && dstCopy->texture()) { | 
| +        fDstCopy.reset(dstCopy->texture()); | 
| +        fDstCopyTextureOffset = dstCopy->offset(); | 
| +        this->addTextureAccess(&fDstCopy); | 
| +    } | 
| +} | 
| + | 
| +void GrXferProcessor::getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const { | 
| +    uint32_t key = this->willReadDstColor() ? 0x1 : 0x0; | 
| +    if (this->getDstCopyTexture() && | 
| +        kTopLeft_GrSurfaceOrigin == this->getDstCopyTexture()->origin()) { | 
| +        key |= 0x2; | 
| +    } | 
| +    b->add32(key); | 
| +    this->onGetGLProcessorKey(caps, b); | 
| +} | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +GrXferProcessor* GrXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI, | 
| +                                                  const GrProcOptInfo& coveragePOI, | 
| +                                                  const GrDeviceCoordTexture* dstCopy, | 
| +                                                  const GrDrawTargetCaps& caps) const { | 
| +#ifdef SK_DEBUG | 
| +    if (this->willReadDstColor()) { | 
| +        if (!caps.dstReadInShaderSupport()) { | 
| +            SkASSERT(dstCopy && dstCopy->texture()); | 
| +        } else { | 
| +            SkASSERT(!dstCopy || !dstCopy->texture()); | 
| +        } | 
| +    } else { | 
| +        SkASSERT(!dstCopy || !dstCopy->texture()); | 
| + | 
| +    } | 
| +#endif | 
| +    return this->onCreateXferProcessor(colorPOI, coveragePOI, dstCopy); | 
| +} | 
| + | 
| +bool GrXPFactory::willNeedDstCopy(const GrDrawTargetCaps& caps) const { | 
| +    return (this->willReadDstColor() && !caps.dstReadInShaderSupport()); | 
| +} | 
| + | 
|  |