Chromium Code Reviews| Index: src/gpu/GrBlend.h |
| diff --git a/src/gpu/GrBlend.h b/src/gpu/GrBlend.h |
| index e5b8993377a4ae5baba5c61ad8bb373424d42f19..aa53a0e935131e1ee1c412ac2f291c323f5dbef0 100644 |
| --- a/src/gpu/GrBlend.h |
| +++ b/src/gpu/GrBlend.h |
| @@ -7,13 +7,13 @@ |
| */ |
| #include "GrTypes.h" |
| -#include "GrColor.h" |
| +#include "SkTLogic.h" |
| #include "GrXferProcessor.h" |
| #ifndef GrBlend_DEFINED |
| #define GrBlend_DEFINED |
| -static inline bool GrBlendCoeffRefsSrc(GrBlendCoeff coeff) { |
| +inline bool GrBlendCoeffRefsSrc(GrBlendCoeff coeff) { |
| switch (coeff) { |
| case kSC_GrBlendCoeff: |
| case kISC_GrBlendCoeff: |
| @@ -25,7 +25,17 @@ static inline bool GrBlendCoeffRefsSrc(GrBlendCoeff coeff) { |
| } |
| } |
| -static inline bool GrBlendCoeffRefsDst(GrBlendCoeff coeff) { |
| +template<GrBlendCoeff Coeff> |
| +struct GrTBlendCoeffRefsSrc : SkTBool<kSC_GrBlendCoeff == Coeff || |
| + kISC_GrBlendCoeff == Coeff || |
| + kSA_GrBlendCoeff == Coeff || |
| + kISA_GrBlendCoeff == Coeff> {}; |
| + |
| +#define GR_BLEND_COEFF_REFS_SRC(COEFF) \ |
| + GrTBlendCoeffRefsSrc<COEFF>::value |
| + |
| + |
| +inline bool GrBlendCoeffRefsDst(GrBlendCoeff coeff) { |
| switch (coeff) { |
| case kDC_GrBlendCoeff: |
| case kIDC_GrBlendCoeff: |
| @@ -37,10 +47,167 @@ static inline bool GrBlendCoeffRefsDst(GrBlendCoeff coeff) { |
| } |
| } |
| -GrColor GrSimplifyBlend(GrBlendCoeff* srcCoeff, |
| - GrBlendCoeff* dstCoeff, |
| - GrColor srcColor, uint32_t srcCompFlags, |
| - GrColor dstColor, uint32_t dstCompFlags, |
| - GrColor constantColor); |
| +template<GrBlendCoeff Coeff> |
| +struct GrTBlendCoeffRefsDst : SkTBool<kDC_GrBlendCoeff == Coeff || |
| + kIDC_GrBlendCoeff == Coeff || |
| + kDA_GrBlendCoeff == Coeff || |
| + kIDA_GrBlendCoeff == Coeff> {}; |
| + |
| +#define GR_BLEND_COEFF_REFS_DST(COEFF) \ |
| + GrTBlendCoeffRefsDst<COEFF>::value |
| + |
| + |
| +inline bool GrBlendCoeffRefsBlendColor(GrBlendCoeff coeff) { |
| + switch (coeff) { |
| + case kConstC_GrBlendCoeff: |
| + case kIConstC_GrBlendCoeff: |
| + case kConstA_GrBlendCoeff: |
| + case kIConstA_GrBlendCoeff: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| +template<GrBlendCoeff Coeff> |
| +struct GrTBlendCoeffRefsBlendColor : SkTBool<kDC_GrBlendCoeff == Coeff || |
|
bsalomon
2015/05/18 17:26:39
This doesn't look correct, looks like a copy of Gr
Chris Dalton
2015/05/18 20:58:23
Oops you're right. Fixed. This currently isn't bei
|
| + kIDC_GrBlendCoeff == Coeff || |
| + kDA_GrBlendCoeff == Coeff || |
| + kIDA_GrBlendCoeff == Coeff> {}; |
| + |
| +#define GR_BLEND_COEFF_REFS_BLEND_COLOR(COEFF) \ |
| + GrTBlendCoeffRefsBlendColor<COEFF>::value |
| + |
| + |
| +inline bool GrBlendCoeffRefsSrc2(GrBlendCoeff coeff) { |
| + switch (coeff) { |
| + case kS2C_GrBlendCoeff: |
| + case kIS2C_GrBlendCoeff: |
| + case kS2A_GrBlendCoeff: |
| + case kIS2A_GrBlendCoeff: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| +template<GrBlendCoeff Coeff> |
| +struct GrTBlendCoeffRefsSrc2 : SkTBool<kS2C_GrBlendCoeff == Coeff || |
| + kIS2C_GrBlendCoeff == Coeff || |
| + kS2A_GrBlendCoeff == Coeff || |
| + kIS2A_GrBlendCoeff == Coeff> {}; |
| + |
| +#define GR_BLEND_COEFF_REFS_SRC2(COEFF) \ |
| + GrTBlendCoeffRefsSrc2<COEFF>::value |
| + |
| + |
| +inline bool GrBlendCoeffsUseSrcColor(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { |
| + return kZero_GrBlendCoeff != srcCoeff || GrBlendCoeffRefsSrc(dstCoeff); |
| +} |
| + |
| +template<GrBlendCoeff SrcCoeff, GrBlendCoeff DstCoeff> |
| +struct GrTBlendCoeffsUseSrcColor : SkTBool<kZero_GrBlendCoeff != SrcCoeff || |
| + GR_BLEND_COEFF_REFS_SRC(DstCoeff)> {}; |
| + |
| +#define GR_BLEND_COEFFS_USE_SRC_COLOR(SRC_COEFF, DST_COEFF) \ |
| + GrTBlendCoeffsUseSrcColor<SRC_COEFF, DST_COEFF>::value |
| + |
| + |
| +inline bool GrBlendCoeffsUseDstColor(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { |
| + return GrBlendCoeffRefsDst(srcCoeff) || kZero_GrBlendCoeff != dstCoeff; |
| +} |
| + |
| +template<GrBlendCoeff SrcCoeff, GrBlendCoeff DstCoeff> |
| +struct GrTBlendCoeffsUseDstColor : SkTBool<GR_BLEND_COEFF_REFS_DST(SrcCoeff) || |
| + kZero_GrBlendCoeff != DstCoeff> {}; |
| + |
| +#define GR_BLEND_COEFFS_USE_DST_COLOR(SRC_COEFF, DST_COEFF) \ |
| + GrTBlendCoeffsUseDstColor<SRC_COEFF, DST_COEFF>::value |
| + |
| + |
| +inline bool GrBlendEquationIsAdvanced(GrBlendEquation equation) { |
| + return equation >= kFirstAdvancedGrBlendEquation; |
| +} |
| + |
| +template<GrBlendEquation Equation> |
| +struct GrTBlendEquationIsAdvanced : SkTBool<Equation >= kFirstAdvancedGrBlendEquation> {}; |
| + |
| +#define GR_BLEND_EQUATION_IS_ADVANCED(EQUATION) \ |
| + GrTBlendEquationIsAdvanced<EQUATION>::value |
| + |
| + |
| +inline bool GrBlendModifiesDst(GrBlendEquation equation, |
| + GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { |
| + if (kAdd_GrBlendEquation != equation && kReverseSubtract_GrBlendEquation != equation) { |
| + return true; |
| + } |
| + return kZero_GrBlendCoeff != srcCoeff || kOne_GrBlendCoeff != dstCoeff; |
| +} |
| + |
| +template<GrBlendEquation BlendEquation, GrBlendCoeff SrcCoeff, GrBlendCoeff DstCoeff> |
| +struct GrTBlendModifiesDst : SkTBool<(kAdd_GrBlendEquation != BlendEquation && |
| + kReverseSubtract_GrBlendEquation != BlendEquation) || |
| + kZero_GrBlendCoeff != SrcCoeff || |
| + kOne_GrBlendCoeff != DstCoeff> {}; |
| + |
| +#define GR_BLEND_MODIFIES_DST(EQUATION, SRC_COEFF, DST_COEFF) \ |
| + GrTBlendModifiesDst<EQUATION, SRC_COEFF, DST_COEFF>::value |
| + |
| + |
| +inline bool GrBlendCanTweakAlphaForCoverage(GrBlendEquation equation, GrBlendCoeff dstCoeff) { |
| + if (GrBlendEquationIsAdvanced(equation)) { |
| + return true; // See GrCustomXfermode.cpp for an explanation on why this works. |
| + } |
| + if (kSubtract_GrBlendEquation == equation) { |
| + return false; |
| + } |
| + |
| + SkASSERT(kAdd_GrBlendEquation == equation || kReverseSubtract_GrBlendEquation == equation); |
| + |
| + /* |
| + The blend equation at this point with f=coverage is: |
| + |
| + D' = f * (S * srcCoeff + D * dstCoeff) + (1-f) * D |
| + |
| + (Let srcCoeff be negative for reverse subtract.) This can be rewritten as: |
| + |
| + D' = f * S * srcCoeff + D * (f * dstCoeff - f + 1) |
| + |
| + We can tweak alpha for coverage when f is not in the dst term. |
| + f cancels out of the dst term when dstCoeff has a 1. |
| + */ |
| + |
| + switch (dstCoeff) { |
| + case kOne_GrBlendCoeff: |
| + case kISC_GrBlendCoeff: |
| + case kIDC_GrBlendCoeff: |
| + case kISA_GrBlendCoeff: |
| + case kIDA_GrBlendCoeff: |
| + case kIConstC_GrBlendCoeff: |
| + case kIConstA_GrBlendCoeff: |
| + case kIS2C_GrBlendCoeff: |
| + case kIS2A_GrBlendCoeff: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| +template<GrBlendEquation Equation, GrBlendCoeff DstCoeff> |
| +struct GrTBlendCanTweakAlphaForCoverage : SkTBool<GR_BLEND_EQUATION_IS_ADVANCED(Equation) || |
| + ((kReverseSubtract_GrBlendEquation == Equation || |
| + kAdd_GrBlendEquation == Equation) && |
| + (kOne_GrBlendCoeff == DstCoeff || |
| + kISC_GrBlendCoeff == DstCoeff || |
| + kIDC_GrBlendCoeff == DstCoeff || |
| + kISA_GrBlendCoeff == DstCoeff || |
| + kIDA_GrBlendCoeff == DstCoeff || |
| + kIConstC_GrBlendCoeff == DstCoeff || |
| + kIConstA_GrBlendCoeff == DstCoeff || |
| + kIS2C_GrBlendCoeff == DstCoeff || |
| + kIS2A_GrBlendCoeff == DstCoeff))> {}; |
| + |
| +#define GR_BLEND_CAN_TWEAK_ALPHA_FOR_COVERAGE(EQUATION, DST_COEFF) \ |
| + GrTBlendCanTweakAlphaForCoverage<EQUATION, DST_COEFF>::value |
| #endif |