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