1baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org/* 2baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org * Copyright 2013 Google Inc. 3baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org * 4baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org * Use of this source code is governed by a BSD-style license that can be 5baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org * found in the LICENSE file. 6baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org */ 7baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org 8baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkPaintPriv.h" 9baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org 10baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkBitmap.h" 11baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkColorFilter.h" 12a85d4d0814818e4ddabb9237da209d61d6cd5854reed#include "SkImage.h" 13baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkPaint.h" 14baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkShader.h" 15baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org 1646c248da267d315d500d2296a205cf22077b3e87piotaixrbool isPaintOpaque(const SkPaint* paint, SkPaintBitmapOpacity contentType) { 17baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org if (!paint) { 1846c248da267d315d500d2296a205cf22077b3e87piotaixr return contentType != kUnknown_SkPaintBitmapOpacity; 19baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org } 20dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; 21dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel 22dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel if (!paint->getColorFilter() || 23dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel ((paint->getColorFilter()->getFlags() & 24dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel SkColorFilter::kAlphaUnchanged_Flag) != 0)) { 25dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel if (0xff == paint->getAlpha() && 26dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel contentType != kUnknown_SkPaintBitmapOpacity && 27dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel (!paint->getShader() || paint->getShader()->isOpaque())) { 28dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel opacityType = SkXfermode::kOpaque_SrcColorOpacity; 29dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel } else if (0 == paint->getColor() && 30dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel contentType == kNoBitmap_SkPaintBitmapOpacity && 31dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel !paint->getShader()) { 32dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; 33dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel } else if (0 == paint->getAlpha()) { 34dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; 35baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org } 36baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org } 37dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel 38dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel return SkXfermode::IsOpaque(paint->getXfermode(), opacityType); 39baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org} 4046c248da267d315d500d2296a205cf22077b3e87piotaixr 4146c248da267d315d500d2296a205cf22077b3e87piotaixrbool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) { 4246c248da267d315d500d2296a205cf22077b3e87piotaixr SkPaintBitmapOpacity contentType; 4346c248da267d315d500d2296a205cf22077b3e87piotaixr 4446c248da267d315d500d2296a205cf22077b3e87piotaixr if(!bmpReplacesShader) 4546c248da267d315d500d2296a205cf22077b3e87piotaixr contentType = kNoBitmap_SkPaintBitmapOpacity; 4646c248da267d315d500d2296a205cf22077b3e87piotaixr else if(bmpReplacesShader->isOpaque()) 4746c248da267d315d500d2296a205cf22077b3e87piotaixr contentType = kOpaque_SkPaintBitmapOpacity; 4846c248da267d315d500d2296a205cf22077b3e87piotaixr else 4946c248da267d315d500d2296a205cf22077b3e87piotaixr contentType = kUnknown_SkPaintBitmapOpacity; 5046c248da267d315d500d2296a205cf22077b3e87piotaixr 5146c248da267d315d500d2296a205cf22077b3e87piotaixr return isPaintOpaque(paint, contentType); 5246c248da267d315d500d2296a205cf22077b3e87piotaixr} 53a85d4d0814818e4ddabb9237da209d61d6cd5854reed 54a85d4d0814818e4ddabb9237da209d61d6cd5854reedbool isPaintOpaque(const SkPaint* paint, const SkImage* image) { 55a85d4d0814818e4ddabb9237da209d61d6cd5854reed return isPaintOpaque(paint, image->isOpaque() ? 56a85d4d0814818e4ddabb9237da209d61d6cd5854reed kOpaque_SkPaintBitmapOpacity : kUnknown_SkPaintBitmapOpacity); 57a85d4d0814818e4ddabb9237da209d61d6cd5854reed} 58