michael@0: /* michael@0: * Copyright 2013 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #include "SkPaintPriv.h" michael@0: michael@0: #include "SkBitmap.h" michael@0: #include "SkColorFilter.h" michael@0: #include "SkPaint.h" michael@0: #include "SkShader.h" michael@0: michael@0: bool isPaintOpaque(const SkPaint* paint, michael@0: const SkBitmap* bmpReplacesShader) { michael@0: // TODO: SkXfermode should have a virtual isOpaque method, which would michael@0: // make it possible to test modes that do not have a Coeff representation. michael@0: michael@0: if (!paint) { michael@0: return bmpReplacesShader ? bmpReplacesShader->isOpaque() : true; michael@0: } michael@0: michael@0: SkXfermode::Coeff srcCoeff, dstCoeff; michael@0: if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){ michael@0: if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff || michael@0: SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) { michael@0: return false; michael@0: } michael@0: switch (dstCoeff) { michael@0: case SkXfermode::kZero_Coeff: michael@0: return true; michael@0: case SkXfermode::kISA_Coeff: michael@0: if (paint->getAlpha() != 255) { michael@0: break; michael@0: } michael@0: if (bmpReplacesShader) { michael@0: if (!bmpReplacesShader->isOpaque()) { michael@0: break; michael@0: } michael@0: } else if (paint->getShader() && !paint->getShader()->isOpaque()) { michael@0: break; michael@0: } michael@0: if (paint->getColorFilter() && michael@0: ((paint->getColorFilter()->getFlags() & michael@0: SkColorFilter::kAlphaUnchanged_Flag) == 0)) { michael@0: break; michael@0: } michael@0: return true; michael@0: case SkXfermode::kSA_Coeff: michael@0: if (paint->getAlpha() != 0) { michael@0: break; michael@0: } michael@0: if (paint->getColorFilter() && michael@0: ((paint->getColorFilter()->getFlags() & michael@0: SkColorFilter::kAlphaUnchanged_Flag) == 0)) { michael@0: break; michael@0: } michael@0: return true; michael@0: case SkXfermode::kSC_Coeff: michael@0: if (paint->getColor() != 0) { // all components must be 0 michael@0: break; michael@0: } michael@0: if (bmpReplacesShader || paint->getShader()) { michael@0: break; michael@0: } michael@0: if (paint->getColorFilter() && ( michael@0: (paint->getColorFilter()->getFlags() & michael@0: SkColorFilter::kAlphaUnchanged_Flag) == 0)) { michael@0: break; michael@0: } michael@0: return true; michael@0: default: michael@0: break; michael@0: } michael@0: } michael@0: return false; michael@0: }