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 "SkBitmap.h"
      9 #include "SkColorFilter.h"
     10 #include "SkPaintPriv.h"
     11 #include "SkImage.h"
     12 #include "SkPaint.h"
     13 #include "SkShader.h"
     14 
     15 static bool changes_alpha(const SkPaint& paint) {
     16     SkColorFilter* cf = paint.getColorFilter();
     17     return cf && !(cf->getFlags() & SkColorFilter::kAlphaUnchanged_Flag);
     18 }
     19 
     20 bool SkPaintPriv::Overwrites(const SkPaint* paint, ShaderOverrideOpacity overrideOpacity) {
     21     if (!paint) {
     22         // No paint means we default to SRC_OVER, so we overwrite iff our shader-override
     23         // is opaque, or we don't have one.
     24         return overrideOpacity != kNotOpaque_ShaderOverrideOpacity;
     25     }
     26 
     27     SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity;
     28 
     29     if (!changes_alpha(*paint)) {
     30         const unsigned paintAlpha = paint->getAlpha();
     31         if (0xff == paintAlpha && overrideOpacity != kNotOpaque_ShaderOverrideOpacity &&
     32             (!paint->getShader() || paint->getShader()->isOpaque()))
     33         {
     34             opacityType = SkXfermode::kOpaque_SrcColorOpacity;
     35         } else if (0 == paintAlpha) {
     36             if (overrideOpacity == kNone_ShaderOverrideOpacity && !paint->getShader()) {
     37                 opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity;
     38             } else {
     39                 opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity;
     40             }
     41         }
     42     }
     43 
     44     return SkXfermode::IsOpaque(paint->getXfermode(), opacityType);
     45 }
     46 
     47 bool SkPaintPriv::Overwrites(const SkBitmap& bitmap, const SkPaint* paint) {
     48     return Overwrites(paint, bitmap.isOpaque() ? kOpaque_ShaderOverrideOpacity
     49                                                : kNotOpaque_ShaderOverrideOpacity);
     50 }
     51 
     52 bool SkPaintPriv::Overwrites(const SkImage* image, const SkPaint* paint) {
     53     return Overwrites(paint, image->isOpaque() ? kOpaque_ShaderOverrideOpacity
     54                                                : kNotOpaque_ShaderOverrideOpacity);
     55 }
     56