SkPaintPriv.cpp revision dcfb7cf336cafffd8d149c908b615e1deaa3a49b
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" 12baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkPaint.h" 13baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkShader.h" 14baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org 1546c248da267d315d500d2296a205cf22077b3e87piotaixrbool isPaintOpaque(const SkPaint* paint, SkPaintBitmapOpacity contentType) { 16baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org if (!paint) { 1746c248da267d315d500d2296a205cf22077b3e87piotaixr return contentType != kUnknown_SkPaintBitmapOpacity; 18baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org } 19dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel SkXfermode::SrcColorOpacity opacityType = SkXfermode::kUnknown_SrcColorOpacity; 20dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel 21dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel if (!paint->getColorFilter() || 22dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel ((paint->getColorFilter()->getFlags() & 23dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel SkColorFilter::kAlphaUnchanged_Flag) != 0)) { 24dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel if (0xff == paint->getAlpha() && 25dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel contentType != kUnknown_SkPaintBitmapOpacity && 26dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel (!paint->getShader() || paint->getShader()->isOpaque())) { 27dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel opacityType = SkXfermode::kOpaque_SrcColorOpacity; 28dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel } else if (0 == paint->getColor() && 29dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel contentType == kNoBitmap_SkPaintBitmapOpacity && 30dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel !paint->getShader()) { 31dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel opacityType = SkXfermode::kTransparentBlack_SrcColorOpacity; 32dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel } else if (0 == paint->getAlpha()) { 33dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel opacityType = SkXfermode::kTransparentAlpha_SrcColorOpacity; 34baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org } 35baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org } 36dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel 37dcfb7cf336cafffd8d149c908b615e1deaa3a49begdaniel return SkXfermode::IsOpaque(paint->getXfermode(), opacityType); 38baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org} 3946c248da267d315d500d2296a205cf22077b3e87piotaixr 4046c248da267d315d500d2296a205cf22077b3e87piotaixrbool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) { 4146c248da267d315d500d2296a205cf22077b3e87piotaixr SkPaintBitmapOpacity contentType; 4246c248da267d315d500d2296a205cf22077b3e87piotaixr 4346c248da267d315d500d2296a205cf22077b3e87piotaixr if(!bmpReplacesShader) 4446c248da267d315d500d2296a205cf22077b3e87piotaixr contentType = kNoBitmap_SkPaintBitmapOpacity; 4546c248da267d315d500d2296a205cf22077b3e87piotaixr else if(bmpReplacesShader->isOpaque()) 4646c248da267d315d500d2296a205cf22077b3e87piotaixr contentType = kOpaque_SkPaintBitmapOpacity; 4746c248da267d315d500d2296a205cf22077b3e87piotaixr else 4846c248da267d315d500d2296a205cf22077b3e87piotaixr contentType = kUnknown_SkPaintBitmapOpacity; 4946c248da267d315d500d2296a205cf22077b3e87piotaixr 5046c248da267d315d500d2296a205cf22077b3e87piotaixr return isPaintOpaque(paint, contentType); 5146c248da267d315d500d2296a205cf22077b3e87piotaixr} 52