|
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, |
|
16 const SkBitmap* bmpReplacesShader) { |
|
17 // TODO: SkXfermode should have a virtual isOpaque method, which would |
|
18 // make it possible to test modes that do not have a Coeff representation. |
|
19 |
|
20 if (!paint) { |
|
21 return bmpReplacesShader ? bmpReplacesShader->isOpaque() : true; |
|
22 } |
|
23 |
|
24 SkXfermode::Coeff srcCoeff, dstCoeff; |
|
25 if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){ |
|
26 if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff || |
|
27 SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) { |
|
28 return false; |
|
29 } |
|
30 switch (dstCoeff) { |
|
31 case SkXfermode::kZero_Coeff: |
|
32 return true; |
|
33 case SkXfermode::kISA_Coeff: |
|
34 if (paint->getAlpha() != 255) { |
|
35 break; |
|
36 } |
|
37 if (bmpReplacesShader) { |
|
38 if (!bmpReplacesShader->isOpaque()) { |
|
39 break; |
|
40 } |
|
41 } else if (paint->getShader() && !paint->getShader()->isOpaque()) { |
|
42 break; |
|
43 } |
|
44 if (paint->getColorFilter() && |
|
45 ((paint->getColorFilter()->getFlags() & |
|
46 SkColorFilter::kAlphaUnchanged_Flag) == 0)) { |
|
47 break; |
|
48 } |
|
49 return true; |
|
50 case SkXfermode::kSA_Coeff: |
|
51 if (paint->getAlpha() != 0) { |
|
52 break; |
|
53 } |
|
54 if (paint->getColorFilter() && |
|
55 ((paint->getColorFilter()->getFlags() & |
|
56 SkColorFilter::kAlphaUnchanged_Flag) == 0)) { |
|
57 break; |
|
58 } |
|
59 return true; |
|
60 case SkXfermode::kSC_Coeff: |
|
61 if (paint->getColor() != 0) { // all components must be 0 |
|
62 break; |
|
63 } |
|
64 if (bmpReplacesShader || paint->getShader()) { |
|
65 break; |
|
66 } |
|
67 if (paint->getColorFilter() && ( |
|
68 (paint->getColorFilter()->getFlags() & |
|
69 SkColorFilter::kAlphaUnchanged_Flag) == 0)) { |
|
70 break; |
|
71 } |
|
72 return true; |
|
73 default: |
|
74 break; |
|
75 } |
|
76 } |
|
77 return false; |
|
78 } |