Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2013 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkPaintPriv.h"
      9 
     10 #include "SkBitmap.h"
     11 #include "SkColorFilter.h"
     12 #include "SkPaint.h"
     13 #include "SkShader.h"
     14 
     15 bool isPaintOpaque(const SkPaint* paint,
     16                    const SkBitmap* bmpReplacesShader) {
     17     // TODO: SkXfermode should have a virtual isOpaque method, which would
     18     // make it possible to test modes that do not have a Coeff representation.
     19 
     20     if (!paint) {
     21         return bmpReplacesShader ? bmpReplacesShader->isOpaque() : true;
     22     }
     23 
     24     SkXfermode::Coeff srcCoeff, dstCoeff;
     25     if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){
     26         if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff ||
     27             SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) {
     28             return false;
     29         }
     30         switch (dstCoeff) {
     31         case SkXfermode::kZero_Coeff:
     32             return true;
     33         case SkXfermode::kISA_Coeff:
     34             if (paint->getAlpha() != 255) {
     35                 break;
     36             }
     37             if (bmpReplacesShader) {
     38                 if (!bmpReplacesShader->isOpaque()) {
     39                     break;
     40                 }
     41             } else if (paint->getShader() && !paint->getShader()->isOpaque()) {
     42                 break;
     43             }
     44             if (paint->getColorFilter() &&
     45                 ((paint->getColorFilter()->getFlags() &
     46                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
     47                 break;
     48             }
     49             return true;
     50         case SkXfermode::kSA_Coeff:
     51             if (paint->getAlpha() != 0) {
     52                 break;
     53             }
     54             if (paint->getColorFilter() &&
     55                 ((paint->getColorFilter()->getFlags() &
     56                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
     57                 break;
     58             }
     59             return true;
     60         case SkXfermode::kSC_Coeff:
     61             if (paint->getColor() != 0) { // all components must be 0
     62                 break;
     63             }
     64             if (bmpReplacesShader || paint->getShader()) {
     65                 break;
     66             }
     67             if (paint->getColorFilter() && (
     68                 (paint->getColorFilter()->getFlags() &
     69                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
     70                 break;
     71             }
     72             return true;
     73         default:
     74             break;
     75         }
     76     }
     77     return false;
     78 }
     79