| /* |
| * 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 "SkBitmap.h" |
| #include "SkColorFilter.h" |
| #include "SkPaintPriv.h" |
| #include "SkImage.h" |
| #include "SkPaint.h" |
| #include "SkShader.h" |
| |
| static bool changes_alpha(const SkPaint& paint) { |
| SkColorFilter* cf = paint.getColorFilter(); |
| return cf && !(cf->getFlags() & SkColorFilter::kAlphaUnchanged_Flag); |
| } |
| |
| bool SkPaintPriv::Overwrites(const SkPaint* paint, ShaderOverrideOpacity overrideOpacity) { |
| if (!paint) { |
| // No paint means we default to SRC_OVER, so we overwrite iff our shader-override |
| // is opaque, or we don't have one. |
| return overrideOpacity != kNotOpaque_ShaderOverrideOpacity; |
| } |
| |
| SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; |
| |
| if (!changes_alpha(*paint)) { |
| const unsigned paintAlpha = paint->getAlpha(); |
| if (0xff == paintAlpha && overrideOpacity != kNotOpaque_ShaderOverrideOpacity && |
| (!paint->getShader() || paint->getShader()->isOpaque())) |
| { |
| opacityType = SkXfermode::kOpaque_SrcColorOpacity; |
| } else if (0 == paintAlpha) { |
| if (overrideOpacity == kNone_ShaderOverrideOpacity && !paint->getShader()) { |
| opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; |
| } else { |
| opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; |
| } |
| } |
| } |
| |
| return SkXfermode::IsOpaque(paint->getXfermode(), opacityType); |
| } |
| |
| bool SkPaintPriv::Overwrites(const SkBitmap& bitmap, const SkPaint* paint) { |
| return Overwrites(paint, bitmap.isOpaque() ? kOpaque_ShaderOverrideOpacity |
| : kNotOpaque_ShaderOverrideOpacity); |
| } |
| |
| bool SkPaintPriv::Overwrites(const SkImage* image, const SkPaint* paint) { |
| return Overwrites(paint, image->isOpaque() ? kOpaque_ShaderOverrideOpacity |
| : kNotOpaque_ShaderOverrideOpacity); |
| } |