• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 
17 #ifndef ANDROID_HWUI_SKIA_COLOR_FILTER_H
18 #define ANDROID_HWUI_SKIA_COLOR_FILTER_H
19 
20 #include <GLES2/gl2.h>
21 #include <SkColorFilter.h>
22 
23 #include <cutils/compiler.h>
24 
25 #include "ProgramCache.h"
26 #include "Extensions.h"
27 
28 namespace android {
29 namespace uirenderer {
30 
31 ///////////////////////////////////////////////////////////////////////////////
32 // Base color filter
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 /**
36  * Represents a Skia color filter. A color filter modifies a ProgramDescription
37  * and sets uniforms on the resulting shaders.
38  */
39 struct SkiaColorFilter {
40     /**
41      * Type of Skia color filter in use.
42      */
43     enum Type {
44         kNone,
45         kColorMatrix,
46         kLighting,
47         kBlend,
48     };
49 
50     ANDROID_API SkiaColorFilter(SkColorFilter *skFilter, Type type, bool blend);
51     virtual ~SkiaColorFilter();
52 
53     virtual void describe(ProgramDescription& description, const Extensions& extensions) = 0;
54     virtual void setupProgram(Program* program) = 0;
55 
blendSkiaColorFilter56     inline bool blend() const {
57         return mBlend;
58     }
59 
typeSkiaColorFilter60     Type type() const {
61         return mType;
62     }
63 
getSkColorFilterSkiaColorFilter64     SkColorFilter* getSkColorFilter() {
65         return mSkFilter;
66     }
67 
68 protected:
69     Type mType;
70     bool mBlend;
71 
72 private:
73     SkColorFilter *mSkFilter;
74 }; // struct SkiaColorFilter
75 
76 ///////////////////////////////////////////////////////////////////////////////
77 // Implementations
78 ///////////////////////////////////////////////////////////////////////////////
79 
80 /**
81  * A color filter that multiplies the source color with a matrix and adds a vector.
82  */
83 struct SkiaColorMatrixFilter: public SkiaColorFilter {
84     ANDROID_API SkiaColorMatrixFilter(SkColorFilter *skFilter, float* matrix, float* vector);
85     ~SkiaColorMatrixFilter();
86 
87     void describe(ProgramDescription& description, const Extensions& extensions);
88     void setupProgram(Program* program);
89 
90 private:
91     float* mMatrix;
92     float* mVector;
93 }; // struct SkiaColorMatrixFilter
94 
95 /**
96  * A color filters that multiplies the source color with a fixed value and adds
97  * another fixed value. Ignores the alpha channel of both arguments.
98  */
99 struct SkiaLightingFilter: public SkiaColorFilter {
100     ANDROID_API SkiaLightingFilter(SkColorFilter *skFilter, int multiply, int add);
101 
102     void describe(ProgramDescription& description, const Extensions& extensions);
103     void setupProgram(Program* program);
104 
105 private:
106     GLfloat mMulR, mMulG, mMulB;
107     GLfloat mAddR, mAddG, mAddB;
108 }; // struct SkiaLightingFilter
109 
110 /**
111  * A color filters that blends the source color with a specified destination color
112  * and PorterDuff blending mode.
113  */
114 struct SkiaBlendFilter: public SkiaColorFilter {
115     ANDROID_API SkiaBlendFilter(SkColorFilter *skFilter, int color, SkXfermode::Mode mode);
116 
117     void describe(ProgramDescription& description, const Extensions& extensions);
118     void setupProgram(Program* program);
119 
120 private:
121     SkXfermode::Mode mMode;
122     GLfloat mR, mG, mB, mA;
123 }; // struct SkiaBlendFilter
124 
125 }; // namespace uirenderer
126 }; // namespace android
127 
128 #endif // ANDROID_HWUI_SKIA_COLOR_FILTER_H
129