GrPaint.cpp revision b6cbc38702dc4a1540a17181cbdab71060c92ce7
142dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
242dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org/*
342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org * Copyright 2013 Google Inc.
442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org *
542dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
642dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org * found in the LICENSE file.
742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org */
842dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
942dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org#include "GrPaint.h"
1042dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
1124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org#include "GrBlend.h"
12b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel#include "GrProcOptInfo.h"
1342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org#include "effects/GrSimpleTextureEffect.h"
1442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
15b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
16b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref();
1742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
1842dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
19b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
20b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref();
2142dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
2242dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
23b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addColorTextureProcessor(GrTexture* texture,
2442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org                                    const SkMatrix& matrix,
2542dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org                                    const GrTextureParams& params) {
26b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
2742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
2842dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
29b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addCoverageTextureProcessor(GrTexture* texture,
3042dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org                                       const SkMatrix& matrix,
3142dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org                                       const GrTextureParams& params) {
32b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
3342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
3424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
3524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::isOpaque() const {
3624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    return this->getOpaqueAndKnownColor(NULL, NULL);
3724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org}
3824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
3924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::isOpaqueAndConstantColor(GrColor* color) const {
40b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    GrColor tempColor = 0;
41b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    uint32_t colorComps = 0;
4224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    if (this->getOpaqueAndKnownColor(&tempColor, &colorComps)) {
4324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org        if (kRGBA_GrColorComponentFlags == colorComps) {
4424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org            *color = tempColor;
4524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org            return true;
4624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org        }
4724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    }
4824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    return false;
4924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org}
5024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
5124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor,
5224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                                     uint32_t* solidColorKnownComponents) const {
5324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
5424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    // TODO: Share this implementation with GrDrawState
55b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel
56b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    GrProcOptInfo coverageProcInfo;
57b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    coverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->numCoverageStages(),
58b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                           0xFFFFFFFF, kRGBA_GrColorComponentFlags, true);
5924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
60b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    if (!coverageProcInfo.isSolidWhite()) {
6124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org        return false;
6224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    }
6324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
64b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    GrProcOptInfo colorProcInfo;
65b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    colorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColorStages(), fColor,
66b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                                        kRGBA_GrColorComponentFlags, false);
6724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
68f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT((NULL == solidColor) == (NULL == solidColorKnownComponents));
6924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
7024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    GrBlendCoeff srcCoeff = fSrcBlendCoeff;
7124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    GrBlendCoeff dstCoeff = fDstBlendCoeff;
72b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel    GrSimplifyBlend(&srcCoeff, &dstCoeff, colorProcInfo.color(), colorProcInfo.validFlags(),
731a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel                    0, 0, 0);
7424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
7524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    bool opaque = kZero_GrBlendCoeff == dstCoeff && !GrBlendCoeffRefsDst(srcCoeff);
7649f085dddff10473b6ebf832a974288300224e60bsalomon    if (solidColor) {
7724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org        if (opaque) {
7824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org            switch (srcCoeff) {
7924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kZero_GrBlendCoeff:
8024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    *solidColor = 0;
8124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    *solidColorKnownComponents = kRGBA_GrColorComponentFlags;
8224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    break;
8324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
8424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kOne_GrBlendCoeff:
85b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                    *solidColor = colorProcInfo.color();
86b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel                    *solidColorKnownComponents = colorProcInfo.validFlags();
8724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    break;
8824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
8924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                // The src coeff should never refer to the src and if it refers to dst then opaque
9024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                // should have been false.
9124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kSC_GrBlendCoeff:
9224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kISC_GrBlendCoeff:
9324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kDC_GrBlendCoeff:
9424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kIDC_GrBlendCoeff:
9524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kSA_GrBlendCoeff:
9624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kISA_GrBlendCoeff:
9724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kDA_GrBlendCoeff:
9824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kIDA_GrBlendCoeff:
9924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                default:
10088cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org                    SkFAIL("srcCoeff should not refer to src or dst.");
10124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    break;
10224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
10324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                // TODO: update this once GrPaint actually has a const color.
10424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kConstC_GrBlendCoeff:
10524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kIConstC_GrBlendCoeff:
10624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kConstA_GrBlendCoeff:
10724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                case kIConstA_GrBlendCoeff:
10824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    *solidColorKnownComponents = 0;
10924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org                    break;
11024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org            }
11124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org        } else {
11224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org            solidColorKnownComponents = 0;
11324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org        }
11424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    }
11524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    return opaque;
11624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org}
117