Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / core / SkPaintPriv.cpp
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 "SkPaint.h"
13 #include "SkShader.h"
14
15 bool isPaintOpaque(const SkPaint* paint, SkPaintBitmapOpacity contentType) {
16     // TODO: SkXfermode should have a virtual isOpaque method, which would
17     // make it possible to test modes that do not have a Coeff representation.
18
19     if (!paint) {
20         return contentType != kUnknown_SkPaintBitmapOpacity;
21     }
22
23     SkXfermode::Coeff srcCoeff, dstCoeff;
24     if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){
25         if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff ||
26             SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) {
27             return false;
28         }
29         switch (dstCoeff) {
30         case SkXfermode::kZero_Coeff:
31             return true;
32         case SkXfermode::kISA_Coeff:
33             if (paint->getAlpha() != 255) {
34                 break;
35             }
36             if (contentType == kUnknown_SkPaintBitmapOpacity) {
37                 break;
38             } else if (paint->getShader() && !paint->getShader()->isOpaque()) {
39                 break;
40             }
41             if (paint->getColorFilter() &&
42                 ((paint->getColorFilter()->getFlags() &
43                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
44                 break;
45             }
46             return true;
47         case SkXfermode::kSA_Coeff:
48             if (paint->getAlpha() != 0) {
49                 break;
50             }
51             if (paint->getColorFilter() &&
52                 ((paint->getColorFilter()->getFlags() &
53                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
54                 break;
55             }
56             return true;
57         case SkXfermode::kSC_Coeff:
58             if (paint->getColor() != 0) { // all components must be 0
59                 break;
60             }
61             if (contentType != kNoBitmap_SkPaintBitmapOpacity || paint->getShader()) {
62                 break;
63             }
64             if (paint->getColorFilter() && (
65                 (paint->getColorFilter()->getFlags() &
66                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
67                 break;
68             }
69             return true;
70         default:
71             break;
72         }
73     }
74     return false;
75 }
76
77 bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader) {
78     SkPaintBitmapOpacity contentType;
79
80     if(!bmpReplacesShader)
81         contentType = kNoBitmap_SkPaintBitmapOpacity;
82     else if(bmpReplacesShader->isOpaque())
83         contentType = kOpaque_SkPaintBitmapOpacity;
84     else
85         contentType = kUnknown_SkPaintBitmapOpacity;
86
87     return isPaintOpaque(paint, contentType);
88 }