SkiaShader.h revision 922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9
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_SHADER_H 18#define ANDROID_HWUI_SKIA_SHADER_H 19 20#include "FloatColor.h" 21#include "Matrix.h" 22 23#include <GLES2/gl2.h> 24#include <SkShader.h> 25#include <SkXfermode.h> 26#include <cutils/compiler.h> 27 28namespace android { 29namespace uirenderer { 30 31class Caches; 32class Extensions; 33class Layer; 34class Texture; 35struct ProgramDescription; 36 37/** 38 * Type of Skia shader in use. 39 * 40 * Note that kBitmap | kGradient = kCompose, since Compose implies 41 * both its component types are in use simultaneously. No other 42 * composition of multiple types is supported. 43 */ 44enum SkiaShaderType { 45 kNone_SkiaShaderType = 0, 46 kBitmap_SkiaShaderType = 1, 47 kGradient_SkiaShaderType = 2, 48 kCompose_SkiaShaderType = kBitmap_SkiaShaderType | kGradient_SkiaShaderType, 49 kLayer_SkiaShaderType = 4, 50}; 51 52struct SkiaShaderData { 53 SkiaShaderType skiaShaderType; 54 struct BitmapShaderData { 55 Texture* bitmapTexture; 56 GLuint bitmapSampler; 57 GLenum wrapS; 58 GLenum wrapT; 59 60 Matrix4 textureTransform; 61 float textureDimension[2]; 62 } bitmapData; 63 struct GradientShaderData { 64 Matrix4 screenSpace; 65 GLuint ditherSampler; 66 67 // simple gradient 68 FloatColor startColor; 69 FloatColor endColor; 70 71 // complex gradient 72 Texture* gradientTexture; 73 GLuint gradientSampler; 74 GLenum wrapST; 75 76 } gradientData; 77 struct LayerShaderData { 78 Layer* layer; 79 GLuint bitmapSampler; 80 GLenum wrapS; 81 GLenum wrapT; 82 83 Matrix4 textureTransform; 84 float textureDimension[2]; 85 } layerData; 86}; 87 88class SkiaShader { 89public: 90 static SkiaShaderType getType(const SkShader& shader); 91 static void describe(Caches* caches, ProgramDescription& description, 92 const Extensions& extensions, const SkShader& shader); 93 static void setupProgram(Caches* caches, const mat4& modelViewMatrix, 94 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader); 95 96 // new SkiaShader interaction model - store into ShaderData, and apply to Caches/Program/GL 97 static void store(Caches& caches, const SkShader* shader, const Matrix4& modelViewMatrix, 98 GLuint* textureUnit, ProgramDescription* description, 99 SkiaShaderData* outData); 100 static void apply(Caches& caches, const SkiaShaderData& data); 101}; 102 103class InvalidSkiaShader { 104public: 105 static void describe(Caches* caches, ProgramDescription& description, 106 const Extensions& extensions, const SkShader& shader) { 107 // This shader is unsupported. Skip it. 108 } 109 static void setupProgram(Caches* caches, const mat4& modelViewMatrix, 110 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader) { 111 // This shader is unsupported. Skip it. 112 } 113 114}; 115/** 116 * A shader that draws a layer. 117 */ 118class SkiaLayerShader { 119public: 120 static void describe(Caches* caches, ProgramDescription& description, 121 const Extensions& extensions, const SkShader& shader); 122 static void setupProgram(Caches* caches, const mat4& modelViewMatrix, 123 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader); 124}; // class SkiaLayerShader 125 126/** 127 * A shader that draws a bitmap. 128 */ 129class SkiaBitmapShader { 130public: 131 static void describe(Caches* caches, ProgramDescription& description, 132 const Extensions& extensions, const SkShader& shader); 133 static void setupProgram(Caches* caches, const mat4& modelViewMatrix, 134 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader); 135 136 137}; // class SkiaBitmapShader 138 139/** 140 * A shader that draws one of three types of gradient, depending on shader param. 141 */ 142class SkiaGradientShader { 143public: 144 static void describe(Caches* caches, ProgramDescription& description, 145 const Extensions& extensions, const SkShader& shader); 146 static void setupProgram(Caches* caches, const mat4& modelViewMatrix, 147 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader); 148}; 149 150/** 151 * A shader that draws two shaders, composited with an xfermode. 152 */ 153class SkiaComposeShader { 154public: 155 static void describe(Caches* caches, ProgramDescription& description, 156 const Extensions& extensions, const SkShader& shader); 157 static void setupProgram(Caches* caches, const mat4& modelViewMatrix, 158 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader); 159}; // class SkiaComposeShader 160 161}; // namespace uirenderer 162}; // namespace android 163 164#endif // ANDROID_HWUI_SKIA_SHADER_H 165