/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkPaintPriv.h" #include "SkBitmap.h" #include "SkColorFilter.h" #include "SkPaint.h" #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; } } return false; } bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) { SkPaintBitmapOpacity contentType; if(!bmpReplacesShader) contentType = kNoBitmap_SkPaintBitmapOpacity; else if(bmpReplacesShader->isOpaque()) contentType = kOpaque_SkPaintBitmapOpacity; else contentType = kUnknown_SkPaintBitmapOpacity; return isPaintOpaque(paint, contentType); }