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 void store(Caches& caches, const SkShader& shader, const Matrix4& modelViewMatrix, 91 GLuint* textureUnit, ProgramDescription* description, 92 SkiaShaderData* outData); 93 static void apply(Caches& caches, const SkiaShaderData& data); 94}; 95 96}; // namespace uirenderer 97}; // namespace android 98 99#endif // ANDROID_HWUI_SKIA_SHADER_H 100