/* * 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) { if (!paint) { return contentType != kUnknown_SkPaintBitmapOpacity; } SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; if (!paint->getColorFilter() || ((paint->getColorFilter()->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) != 0)) { if (0xff == paint->getAlpha() && contentType != kUnknown_SkPaintBitmapOpacity && (!paint->getShader() || paint->getShader()->isOpaque())) { opacityType = SkXfermode::kOpaque_SrcColorOpacity; } else if (0 == paint->getColor() && contentType == kNoBitmap_SkPaintBitmapOpacity && !paint->getShader()) { opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; } else if (0 == paint->getAlpha()) { opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; } } return SkXfermode::IsOpaque(paint->getXfermode(), opacityType); } 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); }