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