Chromium Code Reviews| Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp |
| diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
| index a091a48b08e21faf3dc94e524f93163fd0508939..2dd3d539a6061785c624ea340a2169cae98de0ec 100644 |
| --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
| +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
| @@ -443,47 +443,20 @@ bool GrPorterDuffXPFactory::canApplyCoverage(const GrProcOptInfo& colorPOI, |
| return false; |
| } |
| -bool GrPorterDuffXPFactory::willBlendWithDst(const GrProcOptInfo& colorPOI, |
| - const GrProcOptInfo& coveragePOI, |
| - bool colorWriteDisabled) const { |
| - if (!coveragePOI.isSolidWhite()) { |
| - return true; |
| - } |
| - |
| - // TODO: once all SkXferEffects are XP's then we will never reads dst here since only XP's |
| - // will readDst and PD XP's don't read dst. |
| - if ((!colorWriteDisabled && colorPOI.readsDst()) || coveragePOI.readsDst()) { |
| - return true; |
| - } |
| - |
| - if (GrBlendCoeffRefsDst(fSrcCoeff)) { |
| - return true; |
| - } |
| - |
| - bool srcAIsOne = colorPOI.isOpaque(); |
| - |
| - if (!(kZero_GrBlendCoeff == fDstCoeff || |
| - (kISA_GrBlendCoeff == fDstCoeff && srcAIsOne))) { |
| - return true; |
| - } |
| - |
| - return false; |
| -} |
| - |
| bool GrPorterDuffXPFactory::canTweakAlphaForCoverage() const { |
| return can_tweak_alpha_for_coverage(fDstCoeff); |
| } |
| -bool GrPorterDuffXPFactory::getOpaqueAndKnownColor(const GrProcOptInfo& colorPOI, |
| - const GrProcOptInfo& coveragePOI, |
| - GrColor* solidColor, |
| - uint32_t* solidColorKnownComponents) const { |
| +void GrPorterDuffXPFactory::getInvariantOutput(const GrProcOptInfo& colorPOI, |
| + const GrProcOptInfo& coveragePOI, |
| + bool colorWriteDisabled, |
| + GrXPFactory::InvariantOutput* output) const { |
| if (!coveragePOI.isSolidWhite()) { |
| - return false; |
| + output->fWillBlendWithDst = true; |
| + output->fBlendedColorFlags = 0; |
| + return; |
| } |
| - SkASSERT((NULL == solidColor) == (NULL == solidColorKnownComponents)); |
| - |
| GrBlendCoeff srcCoeff = fSrcCoeff; |
| GrBlendCoeff dstCoeff = fDstCoeff; |
| @@ -492,47 +465,62 @@ bool GrPorterDuffXPFactory::getOpaqueAndKnownColor(const GrProcOptInfo& colorPOI |
| GrSimplifyBlend(&srcCoeff, &dstCoeff, colorPOI.color(), colorPOI.validFlags(), |
| 0, 0, 0); |
| - bool opaque = kZero_GrBlendCoeff == dstCoeff && !GrBlendCoeffRefsDst(srcCoeff); |
| - if (solidColor) { |
| - if (opaque) { |
| - switch (srcCoeff) { |
| - case kZero_GrBlendCoeff: |
| - *solidColor = 0; |
| - *solidColorKnownComponents = kRGBA_GrColorComponentFlags; |
| - break; |
| + if (GrBlendCoeffRefsDst(srcCoeff)) { |
| + output->fWillBlendWithDst = true; |
| + output->fBlendedColorFlags = 0; |
| + return; |
| + } |
| - case kOne_GrBlendCoeff: |
| - *solidColor = colorPOI.color(); |
| - *solidColorKnownComponents = colorPOI.validFlags(); |
| - break; |
| + if (kZero_GrBlendCoeff != dstCoeff) { |
| + bool srcAIsOne = colorPOI.isOpaque(); |
| + if (kISA_GrBlendCoeff != dstCoeff || !srcAIsOne) { |
| + output->fWillBlendWithDst = true; |
| + } |
| + output->fBlendedColorFlags = 0; |
| + return; |
| + } |
| - // The src coeff should never refer to the src and if it refers to dst then opaque |
| - // should have been false. |
| - case kSC_GrBlendCoeff: |
| - case kISC_GrBlendCoeff: |
| - case kDC_GrBlendCoeff: |
| - case kIDC_GrBlendCoeff: |
| - case kSA_GrBlendCoeff: |
| - case kISA_GrBlendCoeff: |
| - case kDA_GrBlendCoeff: |
| - case kIDA_GrBlendCoeff: |
| - default: |
| - SkFAIL("srcCoeff should not refer to src or dst."); |
| - break; |
| + switch (srcCoeff) { |
| + case kZero_GrBlendCoeff: |
| + output->fBlendedColor = 0; |
| + output->fBlendedColorFlags = kRGBA_GrColorComponentFlags; |
| + break; |
| - // TODO: update this once GrPaint actually has a const color. |
| - case kConstC_GrBlendCoeff: |
| - case kIConstC_GrBlendCoeff: |
| - case kConstA_GrBlendCoeff: |
| - case kIConstA_GrBlendCoeff: |
| - *solidColorKnownComponents = 0; |
| - break; |
| - } |
| - } else { |
| - solidColorKnownComponents = 0; |
| - } |
| + case kOne_GrBlendCoeff: |
| + output->fBlendedColor = colorPOI.color(); |
| + output->fBlendedColorFlags = colorPOI.validFlags(); |
| + break; |
| + |
| + // The src coeff should never refer to the src and if it refers to dst then opaque |
| + // should have been false. |
| + case kSC_GrBlendCoeff: |
| + case kISC_GrBlendCoeff: |
| + case kDC_GrBlendCoeff: |
| + case kIDC_GrBlendCoeff: |
| + case kSA_GrBlendCoeff: |
| + case kISA_GrBlendCoeff: |
| + case kDA_GrBlendCoeff: |
| + case kIDA_GrBlendCoeff: |
| + default: |
| + SkFAIL("srcCoeff should not refer to src or dst."); |
| + break; |
| + |
| + // TODO: update this once GrPaint actually has a const color. |
| + case kConstC_GrBlendCoeff: |
| + case kIConstC_GrBlendCoeff: |
| + case kConstA_GrBlendCoeff: |
| + case kIConstA_GrBlendCoeff: |
| + output->fBlendedColorFlags = 0; |
| + break; |
| + } |
| + |
| + // TODO: once all SkXferEffects are XP's then we will never reads dst here since only XP's |
| + // will readDst and PD XP's don't read dst. |
| + if ((!colorWriteDisabled && colorPOI.readsDst()) || coveragePOI.readsDst()) { |
|
bsalomon
2014/12/18 20:29:48
output->fWillBlendWithDst = (!colorWriteDisabled &
|
| + output->fWillBlendWithDst = true; |
| + return; |
| } |
| - return opaque; |
| + output->fWillBlendWithDst = false; |
| } |
| GR_DEFINE_XP_FACTORY_TEST(GrPorterDuffXPFactory); |