1db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy/*
2db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Copyright (C) 2010 The Android Open Source Project
3db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *
4db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * you may not use this file except in compliance with the License.
6db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * You may obtain a copy of the License at
7db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *
8db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *
10db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Unless required by applicable law or agreed to in writing, software
11db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * See the License for the specific language governing permissions and
14db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * limitations under the License.
15db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy */
16db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_SKIA_COLOR_FILTER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_SKIA_COLOR_FILTER_H
19db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
20db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy#include <GLES2/gl2.h>
21ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase#include <SkColorFilter.h>
22db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
237953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
247953745dd565167113f8cbfc461bc0521d32d870Romain Guy
25db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy#include "ProgramCache.h"
26db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy#include "Extensions.h"
27db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
28db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guynamespace android {
29db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guynamespace uirenderer {
30db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
31db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
32db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Base color filter
33db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
34db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
35db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy/**
36db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Represents a Skia color filter. A color filter modifies a ProgramDescription
37db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * and sets uniforms on the resulting shaders.
38db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy */
39db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guystruct SkiaColorFilter {
40db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    /**
41db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy     * Type of Skia color filter in use.
42db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy     */
43db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    enum Type {
44db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        kNone,
45db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        kColorMatrix,
46db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        kLighting,
47db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        kBlend,
48db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    };
49db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
507953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API SkiaColorFilter(SkColorFilter *skFilter, Type type, bool blend);
51db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    virtual ~SkiaColorFilter();
52db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
53db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    virtual void describe(ProgramDescription& description, const Extensions& extensions) = 0;
54db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    virtual void setupProgram(Program* program) = 0;
55db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
56db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    inline bool blend() const {
57db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        return mBlend;
58db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    }
59db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
60db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    Type type() const {
61db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        return mType;
62db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    }
63db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
64d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    SkColorFilter* getSkColorFilter() {
65ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mSkFilter;
66ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
67ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
68db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyprotected:
69db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    Type mType;
70db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    bool mBlend;
71ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
72ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haaseprivate:
73ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkColorFilter *mSkFilter;
74db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // struct SkiaColorFilter
75db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
76db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
77db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Implementations
78db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
79db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
80db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy/**
81db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * A color filter that multiplies the source color with a matrix and adds a vector.
82db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy */
83db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guystruct SkiaColorMatrixFilter: public SkiaColorFilter {
847953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API SkiaColorMatrixFilter(SkColorFilter *skFilter, float* matrix, float* vector);
85db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    ~SkiaColorMatrixFilter();
86db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
87db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void describe(ProgramDescription& description, const Extensions& extensions);
88db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void setupProgram(Program* program);
89db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
90db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyprivate:
91db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    float* mMatrix;
92db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    float* mVector;
93db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // struct SkiaColorMatrixFilter
94db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
95db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy/**
96db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * A color filters that multiplies the source color with a fixed value and adds
97db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * another fixed value. Ignores the alpha channel of both arguments.
98db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy */
99db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guystruct SkiaLightingFilter: public SkiaColorFilter {
1007953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API SkiaLightingFilter(SkColorFilter *skFilter, int multiply, int add);
101db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
102db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void describe(ProgramDescription& description, const Extensions& extensions);
103db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void setupProgram(Program* program);
104db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
105db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyprivate:
106db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    GLfloat mMulR, mMulG, mMulB;
107db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    GLfloat mAddR, mAddG, mAddB;
108db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // struct SkiaLightingFilter
109db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
110db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy/**
111db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * A color filters that blends the source color with a specified destination color
112db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * and PorterDuff blending mode.
113db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy */
114db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guystruct SkiaBlendFilter: public SkiaColorFilter {
1157953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API SkiaBlendFilter(SkColorFilter *skFilter, int color, SkXfermode::Mode mode);
116db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
117db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void describe(ProgramDescription& description, const Extensions& extensions);
118db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void setupProgram(Program* program);
119db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
120db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyprivate:
121db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    SkXfermode::Mode mMode;
122db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    GLfloat mR, mG, mB, mA;
123db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // struct SkiaBlendFilter
124db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
125db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // namespace uirenderer
126db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // namespace android
127db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
1285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_SKIA_COLOR_FILTER_H
129