diff options
author | egdaniel <egdaniel@google.com> | 2015-01-22 06:52:29 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-22 06:52:29 -0800 |
commit | dcfb7cf336cafffd8d149c908b615e1deaa3a49b (patch) | |
tree | 51ab9f86e99454dea2b9ea3b83e29f29c6fa262c /src/core/SkPaintPriv.cpp | |
parent | 2dca817edb0d741b7d8930009417bf9bd071808d (diff) |
Remove the need for asCoeff in SkXfermode.
BUG=skia:
Review URL: https://codereview.chromium.org/864833002
Diffstat (limited to 'src/core/SkPaintPriv.cpp')
-rw-r--r-- | src/core/SkPaintPriv.cpp | 71 |
1 files changed, 17 insertions, 54 deletions
diff --git a/src/core/SkPaintPriv.cpp b/src/core/SkPaintPriv.cpp index e82c4045aa..c6957cd1ca 100644 --- a/src/core/SkPaintPriv.cpp +++ b/src/core/SkPaintPriv.cpp @@ -13,65 +13,28 @@ #include "SkShader.h" bool isPaintOpaque(const SkPaint* paint, SkPaintBitmapOpacity contentType) { - // TODO: SkXfermode should have a virtual isOpaque method, which would - // make it possible to test modes that do not have a Coeff representation. - if (!paint) { return contentType != kUnknown_SkPaintBitmapOpacity; } - - SkXfermode::Coeff srcCoeff, dstCoeff; - if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){ - if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff || - SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) { - return false; - } - switch (dstCoeff) { - case SkXfermode::kZero_Coeff: - return true; - case SkXfermode::kISA_Coeff: - if (paint->getAlpha() != 255) { - break; - } - if (contentType == kUnknown_SkPaintBitmapOpacity) { - break; - } else if (paint->getShader() && !paint->getShader()->isOpaque()) { - break; - } - if (paint->getColorFilter() && - ((paint->getColorFilter()->getFlags() & - SkColorFilter::kAlphaUnchanged_Flag) == 0)) { - break; - } - return true; - case SkXfermode::kSA_Coeff: - if (paint->getAlpha() != 0) { - break; - } - if (paint->getColorFilter() && - ((paint->getColorFilter()->getFlags() & - SkColorFilter::kAlphaUnchanged_Flag) == 0)) { - break; - } - return true; - case SkXfermode::kSC_Coeff: - if (paint->getColor() != 0) { // all components must be 0 - break; - } - if (contentType != kNoBitmap_SkPaintBitmapOpacity || paint->getShader()) { - break; - } - if (paint->getColorFilter() && ( - (paint->getColorFilter()->getFlags() & - SkColorFilter::kAlphaUnchanged_Flag) == 0)) { - break; - } - return true; - default: - break; + SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; + + if (!paint->getColorFilter() || + ((paint->getColorFilter()->getFlags() & + SkColorFilter::kAlphaUnchanged_Flag) != 0)) { + if (0xff == paint->getAlpha() && + contentType != kUnknown_SkPaintBitmapOpacity && + (!paint->getShader() || paint->getShader()->isOpaque())) { + opacityType = SkXfermode::kOpaque_SrcColorOpacity; + } else if (0 == paint->getColor() && + contentType == kNoBitmap_SkPaintBitmapOpacity && + !paint->getShader()) { + opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; + } else if (0 == paint->getAlpha()) { + opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; } } - return false; + + return SkXfermode::IsOpaque(paint->getXfermode(), opacityType); } bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) { |