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