GrPaint.cpp revision 1a8ecdfb73a15de600d5779b75d7c4b61863c50b
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" 1242dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org#include "effects/GrSimpleTextureEffect.h" 1342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org 14b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { 15b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); 1642dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org} 1742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org 18b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) { 19b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref(); 2042dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org} 2142dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org 22b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addColorTextureProcessor(GrTexture* texture, 2342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org const SkMatrix& matrix, 2442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org const GrTextureParams& params) { 25b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref(); 2642dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org} 2742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org 28b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addCoverageTextureProcessor(GrTexture* texture, 2942dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org const SkMatrix& matrix, 3042dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org const GrTextureParams& params) { 31b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref(); 3242dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org} 3324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 3424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::isOpaque() const { 3524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org return this->getOpaqueAndKnownColor(NULL, NULL); 3624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org} 3724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 3824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::isOpaqueAndConstantColor(GrColor* color) const { 3924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org GrColor tempColor; 4024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org uint32_t colorComps; 4124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org if (this->getOpaqueAndKnownColor(&tempColor, &colorComps)) { 4224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org if (kRGBA_GrColorComponentFlags == colorComps) { 4324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org *color = tempColor; 4424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org return true; 4524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 4624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 4724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org return false; 4824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org} 4924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 5024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor, 5124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org uint32_t* solidColorKnownComponents) const { 5224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 5324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org // TODO: Share this implementation with GrDrawState 5424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 551a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel GrProcessor::InvariantOutput inout; 561a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel inout.fColor = GrColorPackRGBA(fCoverage, fCoverage, fCoverage, fCoverage); 571a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel inout.fValidFlags = kRGBA_GrColorComponentFlags; 581a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel inout.fIsSingleComponent = false; 5924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org int count = fCoverageStages.count(); 6024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org for (int i = 0; i < count; ++i) { 611a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel fCoverageStages[i].getProcessor()->computeInvariantOutput(&inout); 6224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 631a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel if (!inout.isSolidWhite()) { 6424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org return false; 6524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 6624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 671a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel inout.fColor = fColor; 681a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel inout.fValidFlags = kRGBA_GrColorComponentFlags; 691a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel inout.fIsSingleComponent = false; 7024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org count = fColorStages.count(); 7124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org for (int i = 0; i < count; ++i) { 721a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel fColorStages[i].getProcessor()->computeInvariantOutput(&inout); 7324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 7424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 75f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((NULL == solidColor) == (NULL == solidColorKnownComponents)); 7624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 7724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org GrBlendCoeff srcCoeff = fSrcBlendCoeff; 7824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org GrBlendCoeff dstCoeff = fDstBlendCoeff; 791a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel GrSimplifyBlend(&srcCoeff, &dstCoeff, inout.fColor, inout.fValidFlags, 801a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel 0, 0, 0); 8124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 8224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org bool opaque = kZero_GrBlendCoeff == dstCoeff && !GrBlendCoeffRefsDst(srcCoeff); 8349f085dddff10473b6ebf832a974288300224e60bsalomon if (solidColor) { 8424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org if (opaque) { 8524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org switch (srcCoeff) { 8624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kZero_GrBlendCoeff: 8724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org *solidColor = 0; 8824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org *solidColorKnownComponents = kRGBA_GrColorComponentFlags; 8924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org break; 9024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 9124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kOne_GrBlendCoeff: 921a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel *solidColor = inout.fColor; 931a8ecdfb73a15de600d5779b75d7c4b61863c50begdaniel *solidColorKnownComponents = inout.fValidFlags; 9424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org break; 9524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 9624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org // The src coeff should never refer to the src and if it refers to dst then opaque 9724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org // should have been false. 9824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kSC_GrBlendCoeff: 9924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kISC_GrBlendCoeff: 10024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kDC_GrBlendCoeff: 10124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kIDC_GrBlendCoeff: 10224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kSA_GrBlendCoeff: 10324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kISA_GrBlendCoeff: 10424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kDA_GrBlendCoeff: 10524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kIDA_GrBlendCoeff: 10624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org default: 10788cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("srcCoeff should not refer to src or dst."); 10824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org break; 10924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org 11024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org // TODO: update this once GrPaint actually has a const color. 11124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kConstC_GrBlendCoeff: 11224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kIConstC_GrBlendCoeff: 11324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kConstA_GrBlendCoeff: 11424ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org case kIConstA_GrBlendCoeff: 11524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org *solidColorKnownComponents = 0; 11624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org break; 11724ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 11824ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } else { 11924ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org solidColorKnownComponents = 0; 12024ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 12124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org } 12224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org return opaque; 12324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org} 124