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