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