1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "GrPaint.h"
9 
10 #include "GrProcOptInfo.h"
11 #include "effects/GrCoverageSetOpXP.h"
12 #include "effects/GrPorterDuffXferProcessor.h"
13 #include "effects/GrSimpleTextureEffect.h"
14 
GrPaint()15 GrPaint::GrPaint()
16     : fAntiAlias(false)
17     , fDisableOutputConversionToSRGB(false)
18     , fAllowSRGBInputs(false)
19     , fUsesDistanceVectorField(false)
20     , fColor(GrColor4f::FromGrColor(GrColor_WHITE)) {}
21 
setCoverageSetOpXPFactory(SkRegion::Op regionOp,bool invertCoverage)22 void GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) {
23     fXPFactory = GrCoverageSetOpXPFactory::Make(regionOp, invertCoverage);
24 }
25 
addColorTextureProcessor(GrTexture * texture,sk_sp<GrColorSpaceXform> colorSpaceXform,const SkMatrix & matrix)26 void GrPaint::addColorTextureProcessor(GrTexture* texture,
27                                        sk_sp<GrColorSpaceXform> colorSpaceXform,
28                                        const SkMatrix& matrix) {
29     this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(texture,
30                                                                 std::move(colorSpaceXform),
31                                                                 matrix));
32 }
33 
addCoverageTextureProcessor(GrTexture * texture,const SkMatrix & matrix)34 void GrPaint::addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
35     this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(texture, nullptr, matrix));
36 }
37 
addColorTextureProcessor(GrTexture * texture,sk_sp<GrColorSpaceXform> colorSpaceXform,const SkMatrix & matrix,const GrTextureParams & params)38 void GrPaint::addColorTextureProcessor(GrTexture* texture,
39                                        sk_sp<GrColorSpaceXform> colorSpaceXform,
40                                        const SkMatrix& matrix,
41                                        const GrTextureParams& params) {
42     this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(texture,
43                                                                 std::move(colorSpaceXform),
44                                                                 matrix, params));
45 }
46 
addCoverageTextureProcessor(GrTexture * texture,const SkMatrix & matrix,const GrTextureParams & params)47 void GrPaint::addCoverageTextureProcessor(GrTexture* texture,
48                                           const SkMatrix& matrix,
49                                           const GrTextureParams& params) {
50     this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(texture, nullptr, matrix,
51                                                                    params));
52 }
53 
internalIsConstantBlendedColor(GrColor paintColor,GrColor * color) const54 bool GrPaint::internalIsConstantBlendedColor(GrColor paintColor, GrColor* color) const {
55     GrProcOptInfo colorProcInfo;
56     colorProcInfo.calcWithInitialValues(
57         sk_sp_address_as_pointer_address(fColorFragmentProcessors.begin()),
58         this->numColorFragmentProcessors(), paintColor, kRGBA_GrColorComponentFlags, false);
59 
60     GrXPFactory::InvariantBlendedColor blendedColor;
61     if (fXPFactory) {
62         fXPFactory->getInvariantBlendedColor(colorProcInfo, &blendedColor);
63     } else {
64         GrPorterDuffXPFactory::SrcOverInvariantBlendedColor(colorProcInfo.color(),
65                                                             colorProcInfo.validFlags(),
66                                                             colorProcInfo.isOpaque(),
67                                                             &blendedColor);
68     }
69 
70     if (kRGBA_GrColorComponentFlags == blendedColor.fKnownColorFlags) {
71         *color = blendedColor.fKnownColor;
72         return true;
73     }
74     return false;
75 }
76