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