diff options
author | Mike Reed <reed@google.com> | 2016-10-05 14:03:43 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-10-05 18:31:17 +0000 |
commit | 2b2fc7db4f8a4a4d4a51d7eb4df6aa62e309928d (patch) | |
tree | cfa3f2de434cb5dcabf98720460105964f78bfc3 /src/core/SkXfermode.cpp | |
parent | dbb84c268bd09d2aa47256b5315a87f891583b6b (diff) |
Revert[6] "replace SkXfermode obj with SkBlendMode enum in paints"
- perform version check in CreateProc for XfermodeImageFilter and ArithmeticImageFilter
This reverts commit 3ed485f4249e17abb4b11f5018d03175fd1afb44.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2992
Change-Id: Ib4a154cdd5f5d1dcac921ef50d53b79a2d6a1be8
Reviewed-on: https://skia-review.googlesource.com/2992
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkXfermode.cpp')
-rw-r--r-- | src/core/SkXfermode.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp index 58c557805b..38a160870e 100644 --- a/src/core/SkXfermode.cpp +++ b/src/core/SkXfermode.cpp @@ -1472,3 +1472,64 @@ bool SkProcCoeffXfermode::onAppendStages(SkRasterPipeline* p) const { } return false; } + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode mode) { + switch (mode) { + case SkBlendMode::kDst: + case SkBlendMode::kSrcOver: + case SkBlendMode::kDstOver: + case SkBlendMode::kDstOut: + case SkBlendMode::kSrcATop: + case SkBlendMode::kXor: + case SkBlendMode::kPlus: + return true; + default: + break; + } + return false; +} + +bool SkXfermode::IsOpaque(SkBlendMode mode, SrcColorOpacity opacityType) { + const ProcCoeff rec = gProcCoeffs[(int)mode]; + + switch (rec.fSC) { + case kDA_Coeff: + case kDC_Coeff: + case kIDA_Coeff: + case kIDC_Coeff: + return false; + default: + break; + } + + switch (rec.fDC) { + case kZero_Coeff: + return true; + case kISA_Coeff: + return kOpaque_SrcColorOpacity == opacityType; + case kSA_Coeff: + return kTransparentBlack_SrcColorOpacity == opacityType || + kTransparentAlpha_SrcColorOpacity == opacityType; + case kSC_Coeff: + return kTransparentBlack_SrcColorOpacity == opacityType; + default: + return false; + } + return false; +} + +#if SK_SUPPORT_GPU +sk_sp<GrXPFactory> SkBlendMode_AsXPFactory(SkBlendMode mode) { + const ProcCoeff rec = gProcCoeffs[(int)mode]; + if (CANNOT_USE_COEFF != rec.fSC) { + sk_sp<GrXPFactory> result(GrPorterDuffXPFactory::Make(mode)); + SkASSERT(result); + return result; + } + + SkASSERT(GrCustomXfermode::IsSupportedMode((SkXfermode::Mode)mode)); + return GrCustomXfermode::MakeXPFactory((SkXfermode::Mode)mode); +} +#endif |