Layer.h revision 8f0095cd33558e9cc8a440047908e53b68906f5f
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_LAYER_H 18#define ANDROID_HWUI_LAYER_H 19 20#include <sys/types.h> 21 22#include <GLES2/gl2.h> 23 24#include <ui/Region.h> 25 26#include <SkXfermode.h> 27 28#include "Rect.h" 29#include "SkiaColorFilter.h" 30#include "Vertex.h" 31 32namespace android { 33namespace uirenderer { 34 35/////////////////////////////////////////////////////////////////////////////// 36// Layers 37/////////////////////////////////////////////////////////////////////////////// 38 39/** 40 * A layer has dimensions and is backed by an OpenGL texture or FBO. 41 */ 42struct Layer { 43 Layer(const uint32_t layerWidth, const uint32_t layerHeight): 44 width(layerWidth), height(layerHeight) { 45 mesh = NULL; 46 meshIndices = NULL; 47 meshElementCount = 0; 48 isCacheable = true; 49 isTextureLayer = false; 50 renderTarget = GL_TEXTURE_2D; 51 } 52 53 ~Layer() { 54 if (mesh) delete mesh; 55 if (meshIndices) delete meshIndices; 56 } 57 58 /** 59 * Sets this layer's region to a rectangle. Computes the appropriate 60 * texture coordinates. 61 */ 62 void setRegionAsRect() { 63 const android::Rect& bounds = region.getBounds(); 64 regionRect.set(bounds.leftTop().x, bounds.leftTop().y, 65 bounds.rightBottom().x, bounds.rightBottom().y); 66 67 const float texX = 1.0f / float(width); 68 const float texY = 1.0f / float(height); 69 const float height = layer.getHeight(); 70 texCoords.set( 71 regionRect.left * texX, (height - regionRect.top) * texY, 72 regionRect.right * texX, (height - regionRect.bottom) * texY); 73 } 74 75 /** 76 * Bounds of the layer. 77 */ 78 Rect layer; 79 /** 80 * Texture coordinates of the layer. 81 */ 82 Rect texCoords; 83 84 /** 85 * Name of the FBO used to render the layer. If the name is 0 86 * this layer is not backed by an FBO, but a simple texture. 87 */ 88 GLuint fbo; 89 90 /** 91 * Opacity of the layer. 92 */ 93 int alpha; 94 /** 95 * Blending mode of the layer. 96 */ 97 SkXfermode::Mode mode; 98 /** 99 * Indicates whether this layer should be blended. 100 */ 101 bool blend; 102 103 /** 104 * Indicates whether this layer has been used already. 105 */ 106 bool empty; 107 108 /** 109 * Name of the texture used to render the layer. 110 */ 111 GLuint texture; 112 /** 113 * Width of the layer texture. 114 */ 115 uint32_t width; 116 /** 117 * Height of the layer texture. 118 */ 119 uint32_t height; 120 121 /** 122 * Dirty region indicating what parts of the layer 123 * have been drawn. 124 */ 125 Region region; 126 /** 127 * If the region is a rectangle, coordinates of the 128 * region are stored here. 129 */ 130 Rect regionRect; 131 132 /** 133 * Color filter used to draw this layer. Optional. 134 */ 135 SkiaColorFilter* colorFilter; 136 137 /** 138 * If the layer can be rendered as a mesh, this is non-null. 139 */ 140 TextureVertex* mesh; 141 uint16_t* meshIndices; 142 GLsizei meshElementCount; 143 144 /** 145 * If set to true (by default), the layer can be reused. 146 */ 147 bool isCacheable; 148 149 /** 150 * When set to true, this layer must be treated as a texture 151 * layer. 152 */ 153 bool isTextureLayer; 154 155 /** 156 * Optional texture coordinates transform. 157 */ 158 mat4 texTransform; 159 160 /** 161 * Indicates the render target. 162 */ 163 GLenum renderTarget; 164}; // struct Layer 165 166}; // namespace uirenderer 167}; // namespace android 168 169#endif // ANDROID_HWUI_LAYER_H 170