1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef PAINT_UTILS_H
17 #define PAINT_UTILS_H
18 
19 #include <SkColorFilter.h>
20 #include <SkXfermode.h>
21 
22 namespace android {
23 namespace uirenderer {
24 
25 class PaintUtils {
26 public:
27 
28    /**
29      * Safely retrieves the mode from the specified xfermode. If the specified
30      * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
31      */
getXfermode(SkXfermode * mode)32     static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
33         SkXfermode::Mode resultMode;
34         if (!SkXfermode::AsMode(mode, &resultMode)) {
35             resultMode = SkXfermode::kSrcOver_Mode;
36         }
37         return resultMode;
38     }
39 
getFilter(const SkPaint * paint)40     static inline GLenum getFilter(const SkPaint* paint) {
41         if (!paint || paint->getFilterQuality() != kNone_SkFilterQuality) {
42             return GL_LINEAR;
43         }
44         return GL_NEAREST;
45     }
46 
47     // TODO: move to a method on android:Paint? replace with SkPaint::nothingToDraw()?
paintWillNotDraw(const SkPaint & paint)48     static inline bool paintWillNotDraw(const SkPaint& paint) {
49         return paint.getAlpha() == 0
50                 && !paint.getColorFilter()
51                 && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
52     }
53 
54     // TODO: move to a method on android:Paint? replace with SkPaint::nothingToDraw()?
paintWillNotDrawText(const SkPaint & paint)55     static inline bool paintWillNotDrawText(const SkPaint& paint) {
56         return paint.getAlpha() == 0
57                 && paint.getLooper() == nullptr
58                 && !paint.getColorFilter()
59                 && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
60     }
61 
isBlendedShader(const SkShader * shader)62     static bool isBlendedShader(const SkShader* shader) {
63         if (shader == nullptr) {
64             return false;
65         }
66         return !shader->isOpaque();
67     }
68 
isBlendedColorFilter(const SkColorFilter * filter)69     static bool isBlendedColorFilter(const SkColorFilter* filter) {
70         if (filter == nullptr) {
71             return false;
72         }
73         return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0;
74     }
75 
76 }; // class PaintUtils
77 
78 } /* namespace uirenderer */
79 } /* namespace android */
80 
81 #endif /* PAINT_UTILS_H */
82