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 #include "GrXferProcessor.h"
10 #include "effects/GrCoverageSetOpXP.h"
11 #include "effects/GrPorterDuffXferProcessor.h"
12 #include "effects/GrSimpleTextureEffect.h"
13
setPorterDuffXPFactory(SkBlendMode mode)14 void GrPaint::setPorterDuffXPFactory(SkBlendMode mode) {
15 fXPFactory = GrPorterDuffXPFactory::Get(mode);
16 }
17
setCoverageSetOpXPFactory(SkRegion::Op regionOp,bool invertCoverage)18 void GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) {
19 fXPFactory = GrCoverageSetOpXPFactory::Get(regionOp, invertCoverage);
20 }
21
addColorTextureProcessor(GrResourceProvider * resourceProvider,sk_sp<GrTextureProxy> proxy,sk_sp<GrColorSpaceXform> colorSpaceXform,const SkMatrix & matrix)22 void GrPaint::addColorTextureProcessor(GrResourceProvider* resourceProvider,
23 sk_sp<GrTextureProxy> proxy,
24 sk_sp<GrColorSpaceXform> colorSpaceXform,
25 const SkMatrix& matrix) {
26 this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(resourceProvider, std::move(proxy),
27 std::move(colorSpaceXform),
28 matrix));
29 }
30
addColorTextureProcessor(GrResourceProvider * resourceProvider,sk_sp<GrTextureProxy> proxy,sk_sp<GrColorSpaceXform> colorSpaceXform,const SkMatrix & matrix,const GrSamplerParams & params)31 void GrPaint::addColorTextureProcessor(GrResourceProvider* resourceProvider,
32 sk_sp<GrTextureProxy> proxy,
33 sk_sp<GrColorSpaceXform> colorSpaceXform,
34 const SkMatrix& matrix,
35 const GrSamplerParams& params) {
36 this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(resourceProvider,
37 std::move(proxy),
38 std::move(colorSpaceXform),
39 matrix, params));
40 }
41
addCoverageTextureProcessor(GrResourceProvider * resourceProvider,sk_sp<GrTextureProxy> proxy,const SkMatrix & matrix)42 void GrPaint::addCoverageTextureProcessor(GrResourceProvider* resourceProvider,
43 sk_sp<GrTextureProxy> proxy,
44 const SkMatrix& matrix) {
45 this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(resourceProvider,
46 std::move(proxy),
47 nullptr, matrix));
48 }
49
addCoverageTextureProcessor(GrResourceProvider * resourceProvider,sk_sp<GrTextureProxy> proxy,const SkMatrix & matrix,const GrSamplerParams & params)50 void GrPaint::addCoverageTextureProcessor(GrResourceProvider* resourceProvider,
51 sk_sp<GrTextureProxy> proxy,
52 const SkMatrix& matrix,
53 const GrSamplerParams& params) {
54 this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(resourceProvider,
55 std::move(proxy),
56 nullptr, matrix, params));
57 }
58
isConstantBlendedColor(GrColor * constantColor) const59 bool GrPaint::isConstantBlendedColor(GrColor* constantColor) const {
60 // This used to do a more sophisticated analysis but now it just explicitly looks for common
61 // cases.
62 static const GrXPFactory* kSrc = GrPorterDuffXPFactory::Get(SkBlendMode::kSrc);
63 static const GrXPFactory* kClear = GrPorterDuffXPFactory::Get(SkBlendMode::kClear);
64 if (kClear == fXPFactory) {
65 *constantColor = GrColor_TRANSPARENT_BLACK;
66 return true;
67 }
68 if (this->numColorFragmentProcessors()) {
69 return false;
70 }
71 if (kSrc == fXPFactory || (!fXPFactory && fColor.isOpaque())) {
72 *constantColor = fColor.toGrColor();
73 return true;
74 }
75 return false;
76 }
77