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 "SkImage.h" 13 #include "SkPaint.h" 14 #include "SkShader.h" 15 16 bool isPaintOpaque(const SkPaint* paint, SkPaintBitmapOpacity contentType) { 17 if (!paint) { 18 return contentType != kUnknown_SkPaintBitmapOpacity; 19 } 20 SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; 21 22 if (!paint->getColorFilter() || 23 ((paint->getColorFilter()->getFlags() & 24 SkColorFilter::kAlphaUnchanged_Flag) != 0)) { 25 if (0xff == paint->getAlpha() && 26 contentType != kUnknown_SkPaintBitmapOpacity && 27 (!paint->getShader() || paint->getShader()->isOpaque())) { 28 opacityType = SkXfermode::kOpaque_SrcColorOpacity; 29 } else if (0 == paint->getColor() && 30 contentType == kNoBitmap_SkPaintBitmapOpacity && 31 !paint->getShader()) { 32 opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; 33 } else if (0 == paint->getAlpha()) { 34 opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; 35 } 36 } 37 38 return SkXfermode::IsOpaque(paint->getXfermode(), opacityType); 39 } 40 41 bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) { 42 SkPaintBitmapOpacity contentType; 43 44 if(!bmpReplacesShader) 45 contentType = kNoBitmap_SkPaintBitmapOpacity; 46 else if(bmpReplacesShader->isOpaque()) 47 contentType = kOpaque_SkPaintBitmapOpacity; 48 else 49 contentType = kUnknown_SkPaintBitmapOpacity; 50 51 return isPaintOpaque(paint, contentType); 52 } 53 54 bool isPaintOpaque(const SkPaint* paint, const SkImage* image) { 55 return isPaintOpaque(paint, image->isOpaque() ? 56 kOpaque_SkPaintBitmapOpacity : kUnknown_SkPaintBitmapOpacity); 57 } 58