blob: 328484bd2d6aece501f47a581e2a577be12d23fb [file] [log] [blame]
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +00001
2/*
3 * Copyright 2013 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "GrPaint.h"
10
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000011#include "GrBlend.h"
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000012#include "effects/GrSimpleTextureEffect.h"
13
14void GrPaint::addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) {
bsalomon97b9ab72014-07-08 06:52:35 -070015 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->unref();
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000016}
17
18void GrPaint::addCoverageTextureEffect(GrTexture* texture, const SkMatrix& matrix) {
bsalomon97b9ab72014-07-08 06:52:35 -070019 this->addCoverageEffect(GrSimpleTextureEffect::Create(texture, matrix))->unref();
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000020}
21
22void GrPaint::addColorTextureEffect(GrTexture* texture,
23 const SkMatrix& matrix,
24 const GrTextureParams& params) {
bsalomon97b9ab72014-07-08 06:52:35 -070025 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000026}
27
28void GrPaint::addCoverageTextureEffect(GrTexture* texture,
29 const SkMatrix& matrix,
30 const GrTextureParams& params) {
bsalomon97b9ab72014-07-08 06:52:35 -070031 this->addCoverageEffect(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
commit-bot@chromium.org42dacab2013-07-13 17:24:24 +000032}
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000033
34bool GrPaint::isOpaque() const {
35 return this->getOpaqueAndKnownColor(NULL, NULL);
36}
37
38bool GrPaint::isOpaqueAndConstantColor(GrColor* color) const {
39 GrColor tempColor;
40 uint32_t colorComps;
41 if (this->getOpaqueAndKnownColor(&tempColor, &colorComps)) {
42 if (kRGBA_GrColorComponentFlags == colorComps) {
43 *color = tempColor;
44 return true;
45 }
46 }
47 return false;
48}
49
50bool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor,
51 uint32_t* solidColorKnownComponents) const {
52
53 // TODO: Share this implementation with GrDrawState
54
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000055 GrColor coverage = GrColorPackRGBA(fCoverage, fCoverage, fCoverage, fCoverage);
56 uint32_t coverageComps = kRGBA_GrColorComponentFlags;
57 int count = fCoverageStages.count();
58 for (int i = 0; i < count; ++i) {
bsalomonf99f8842014-07-07 11:54:23 -070059 fCoverageStages[i].getEffect()->getConstantColorComponents(&coverage, &coverageComps);
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000060 }
61 if (kRGBA_GrColorComponentFlags != coverageComps || 0xffffffff != coverage) {
62 return false;
63 }
64
65 GrColor color = fColor;
66 uint32_t colorComps = kRGBA_GrColorComponentFlags;
67 count = fColorStages.count();
68 for (int i = 0; i < count; ++i) {
bsalomonf99f8842014-07-07 11:54:23 -070069 fColorStages[i].getEffect()->getConstantColorComponents(&color, &colorComps);
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000070 }
71
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000072 SkASSERT((NULL == solidColor) == (NULL == solidColorKnownComponents));
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +000073
74 GrBlendCoeff srcCoeff = fSrcBlendCoeff;
75 GrBlendCoeff dstCoeff = fDstBlendCoeff;
76 GrSimplifyBlend(&srcCoeff, &dstCoeff, color, colorComps, 0, 0, 0);
77
78 bool opaque = kZero_GrBlendCoeff == dstCoeff && !GrBlendCoeffRefsDst(srcCoeff);
79 if (NULL != solidColor) {
80 if (opaque) {
81 switch (srcCoeff) {
82 case kZero_GrBlendCoeff:
83 *solidColor = 0;
84 *solidColorKnownComponents = kRGBA_GrColorComponentFlags;
85 break;
86
87 case kOne_GrBlendCoeff:
88 *solidColor = color;
89 *solidColorKnownComponents = colorComps;
90 break;
91
92 // The src coeff should never refer to the src and if it refers to dst then opaque
93 // should have been false.
94 case kSC_GrBlendCoeff:
95 case kISC_GrBlendCoeff:
96 case kDC_GrBlendCoeff:
97 case kIDC_GrBlendCoeff:
98 case kSA_GrBlendCoeff:
99 case kISA_GrBlendCoeff:
100 case kDA_GrBlendCoeff:
101 case kIDA_GrBlendCoeff:
102 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000103 SkFAIL("srcCoeff should not refer to src or dst.");
commit-bot@chromium.org24ab3b02013-08-14 21:56:37 +0000104 break;
105
106 // TODO: update this once GrPaint actually has a const color.
107 case kConstC_GrBlendCoeff:
108 case kIConstC_GrBlendCoeff:
109 case kConstA_GrBlendCoeff:
110 case kIConstA_GrBlendCoeff:
111 *solidColorKnownComponents = 0;
112 break;
113 }
114 } else {
115 solidColorKnownComponents = 0;
116 }
117 }
118 return opaque;
119}