|  |  | 
|  | /* | 
|  | * 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 "GrProcOptInfo.h" | 
|  | #include "effects/GrCoverageSetOpXP.h" | 
|  | #include "effects/GrPorterDuffXferProcessor.h" | 
|  | #include "effects/GrSimpleTextureEffect.h" | 
|  |  | 
|  | GrPaint::GrPaint() | 
|  | : fAntiAlias(false) | 
|  | , fColor(GrColor_WHITE) {} | 
|  |  | 
|  | void GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) { | 
|  | fXPFactory.reset(GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage)); | 
|  | } | 
|  |  | 
|  | void GrPaint::addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { | 
|  | this->addColorFragmentProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); | 
|  | } | 
|  |  | 
|  | void GrPaint::addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { | 
|  | this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); | 
|  | } | 
|  |  | 
|  | void GrPaint::addColorTextureProcessor(GrTexture* texture, | 
|  | const SkMatrix& matrix, | 
|  | const GrTextureParams& params) { | 
|  | this->addColorFragmentProcessor(GrSimpleTextureEffect::Create(texture, | 
|  | matrix, params))->unref(); | 
|  | } | 
|  |  | 
|  | void GrPaint::addCoverageTextureProcessor(GrTexture* texture, | 
|  | const SkMatrix& matrix, | 
|  | const GrTextureParams& params) { | 
|  | this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Create(texture, | 
|  | matrix, params))->unref(); | 
|  | } | 
|  |  | 
|  | bool GrPaint::isConstantBlendedColor(GrColor* color) const { | 
|  | GrProcOptInfo colorProcInfo; | 
|  | colorProcInfo.calcWithInitialValues(fColorFragmentProcessors.begin(), | 
|  | this->numColorFragmentProcessors(), fColor, | 
|  | kRGBA_GrColorComponentFlags, false); | 
|  |  | 
|  | GrXPFactory::InvariantBlendedColor blendedColor; | 
|  | if (fXPFactory) { | 
|  | fXPFactory->getInvariantBlendedColor(colorProcInfo, &blendedColor); | 
|  | } else { | 
|  | GrPorterDuffXPFactory::SrcOverInvariantBlendedColor(colorProcInfo.color(), | 
|  | colorProcInfo.validFlags(), | 
|  | colorProcInfo.isOpaque(), | 
|  | &blendedColor); | 
|  | } | 
|  |  | 
|  | if (kRGBA_GrColorComponentFlags == blendedColor.fKnownColorFlags) { | 
|  | *color = blendedColor.fKnownColor; | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } |