| /* | 
 |  * Copyright 2013 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "GrPaint.h" | 
 | #include "GrXferProcessor.h" | 
 | #include "effects/GrCoverageSetOpXP.h" | 
 | #include "effects/GrPorterDuffXferProcessor.h" | 
 | #include "effects/GrSimpleTextureEffect.h" | 
 |  | 
 | GrPaint::GrPaint(const GrPaint& that) | 
 |         : fXPFactory(that.fXPFactory) | 
 |         , fColorFragmentProcessors(that.fColorFragmentProcessors.count()) | 
 |         , fCoverageFragmentProcessors(that.fCoverageFragmentProcessors.count()) | 
 |         , fTrivial(that.fTrivial) | 
 |         , fColor(that.fColor) { | 
 |     for (int i = 0; i < that.fColorFragmentProcessors.count(); ++i) { | 
 |         fColorFragmentProcessors.push_back(that.fColorFragmentProcessors[i]->clone()); | 
 |         SkASSERT(fColorFragmentProcessors[i]); | 
 |     } | 
 |     for (int i = 0; i < that.fCoverageFragmentProcessors.count(); ++i) { | 
 |         fCoverageFragmentProcessors.push_back(that.fCoverageFragmentProcessors[i]->clone()); | 
 |         SkASSERT(fCoverageFragmentProcessors[i]); | 
 |     } | 
 | } | 
 |  | 
 | void GrPaint::setPorterDuffXPFactory(SkBlendMode mode) { | 
 |     this->setXPFactory(GrPorterDuffXPFactory::Get(mode)); | 
 | } | 
 |  | 
 | void GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) { | 
 |     this->setXPFactory(GrCoverageSetOpXPFactory::Get(regionOp, invertCoverage)); | 
 | } | 
 |  | 
 | void GrPaint::addColorTextureProcessor(sk_sp<GrTextureProxy> proxy, const SkMatrix& matrix) { | 
 |     this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy), matrix)); | 
 | } | 
 |  | 
 | void GrPaint::addColorTextureProcessor(sk_sp<GrTextureProxy> proxy, const SkMatrix& matrix, | 
 |                                        const GrSamplerState& samplerState) { | 
 |     this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy), matrix, | 
 |                                                                 samplerState)); | 
 | } | 
 |  | 
 | void GrPaint::addCoverageTextureProcessor(sk_sp<GrTextureProxy> proxy, | 
 |                                           const SkMatrix& matrix) { | 
 |     this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy), matrix)); | 
 | } | 
 |  | 
 | void GrPaint::addCoverageTextureProcessor(sk_sp<GrTextureProxy> proxy, | 
 |                                           const SkMatrix& matrix, | 
 |                                           const GrSamplerState& params) { | 
 |     this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy), matrix, | 
 |                                                                    params)); | 
 | } | 
 |  | 
 | bool GrPaint::isConstantBlendedColor(SkPMColor4f* constantColor) const { | 
 |     // This used to do a more sophisticated analysis but now it just explicitly looks for common | 
 |     // cases. | 
 |     static const GrXPFactory* kSrc = GrPorterDuffXPFactory::Get(SkBlendMode::kSrc); | 
 |     static const GrXPFactory* kClear = GrPorterDuffXPFactory::Get(SkBlendMode::kClear); | 
 |     if (kClear == fXPFactory) { | 
 |         *constantColor = SK_PMColor4fTRANSPARENT; | 
 |         return true; | 
 |     } | 
 |     if (this->numColorFragmentProcessors()) { | 
 |         return false; | 
 |     } | 
 |     if (kSrc == fXPFactory || (!fXPFactory && fColor.isOpaque())) { | 
 |         *constantColor = fColor; | 
 |         return true; | 
 |     } | 
 |     return false; | 
 | } |