blob: 0c536b077021795a271105578a00ffa3741da35b [file] [log] [blame]
Romain Guydda570202010-07-06 11:39:32 -07001/*
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
Romain Guy5b3b3522010-10-27 18:57:51 -070017#ifndef ANDROID_HWUI_LAYER_H
18#define ANDROID_HWUI_LAYER_H
Romain Guydda570202010-07-06 11:39:32 -070019
Romain Guyf7f93552010-07-08 19:17:03 -070020#include <sys/types.h>
21
Romain Guydda570202010-07-06 11:39:32 -070022#include <GLES2/gl2.h>
23
Romain Guy5b3b3522010-10-27 18:57:51 -070024#include <ui/Region.h>
25
Romain Guydda570202010-07-06 11:39:32 -070026#include <SkXfermode.h>
27
28#include "Rect.h"
Romain Guy171c5922011-01-06 10:04:23 -080029#include "SkiaColorFilter.h"
Romain Guy9ace8f52011-07-07 20:50:11 -070030#include "Texture.h"
Romain Guyf219da52011-01-16 12:54:25 -080031#include "Vertex.h"
Romain Guydda570202010-07-06 11:39:32 -070032
33namespace android {
34namespace uirenderer {
35
Romain Guy8550c4c2010-10-08 15:49:53 -070036///////////////////////////////////////////////////////////////////////////////
37// Layers
38///////////////////////////////////////////////////////////////////////////////
Romain Guydda570202010-07-06 11:39:32 -070039
40/**
Romain Guyeb993562010-10-05 18:14:38 -070041 * A layer has dimensions and is backed by an OpenGL texture or FBO.
Romain Guydda570202010-07-06 11:39:32 -070042 */
43struct Layer {
Romain Guy9ace8f52011-07-07 20:50:11 -070044 Layer(const uint32_t layerWidth, const uint32_t layerHeight) {
Romain Guyf219da52011-01-16 12:54:25 -080045 mesh = NULL;
46 meshIndices = NULL;
47 meshElementCount = 0;
Romain Guy9ace8f52011-07-07 20:50:11 -070048 cacheable = true;
49 textureLayer = false;
Romain Guy8f0095c2011-05-02 17:24:22 -070050 renderTarget = GL_TEXTURE_2D;
Romain Guy9ace8f52011-07-07 20:50:11 -070051 texture.width = layerWidth;
52 texture.height = layerHeight;
53 colorFilter = NULL;
Romain Guyf219da52011-01-16 12:54:25 -080054 }
55
56 ~Layer() {
57 if (mesh) delete mesh;
58 if (meshIndices) delete meshIndices;
Romain Guy8550c4c2010-10-08 15:49:53 -070059 }
60
Romain Guydda570202010-07-06 11:39:32 -070061 /**
Romain Guy9fc27812011-04-27 14:21:41 -070062 * Sets this layer's region to a rectangle. Computes the appropriate
63 * texture coordinates.
64 */
65 void setRegionAsRect() {
66 const android::Rect& bounds = region.getBounds();
67 regionRect.set(bounds.leftTop().x, bounds.leftTop().y,
68 bounds.rightBottom().x, bounds.rightBottom().y);
69
Romain Guy9ace8f52011-07-07 20:50:11 -070070 const float texX = 1.0f / float(texture.width);
71 const float texY = 1.0f / float(texture.height);
Romain Guy9fc27812011-04-27 14:21:41 -070072 const float height = layer.getHeight();
73 texCoords.set(
74 regionRect.left * texX, (height - regionRect.top) * texY,
75 regionRect.right * texX, (height - regionRect.bottom) * texY);
Romain Guy9ace8f52011-07-07 20:50:11 -070076
77 regionRect.translate(layer.left, layer.top);
78 }
79
80 inline uint32_t getWidth() {
81 return texture.width;
82 }
83
84 inline uint32_t getHeight() {
85 return texture.height;
86 }
87
88 void setSize(uint32_t width, uint32_t height) {
89 texture.width = width;
90 texture.height = height;
91 }
92
93 inline void setBlend(bool blend) {
94 texture.blend = blend;
95 }
96
97 inline bool isBlend() {
98 return texture.blend;
99 }
100
101 inline void setAlpha(int alpha) {
102 this->alpha = alpha;
103 }
104
105 inline void setAlpha(int alpha, SkXfermode::Mode mode) {
106 this->alpha = alpha;
107 this->mode = mode;
108 }
109
110 inline int getAlpha() {
111 return alpha;
112 }
113
114 inline SkXfermode::Mode getMode() {
115 return mode;
116 }
117
118 inline void setEmpty(bool empty) {
119 this->empty = empty;
120 }
121
122 inline bool isEmpty() {
123 return empty;
124 }
125
126 inline void setFbo(GLuint fbo) {
127 this->fbo = fbo;
128 }
129
130 inline GLuint getFbo() {
131 return fbo;
132 }
133
134 inline GLuint* getTexturePointer() {
135 return &texture.id;
136 }
137
138 inline GLuint getTexture() {
139 return texture.id;
140 }
141
142 inline GLenum getRenderTarget() {
143 return renderTarget;
144 }
145
146 inline void setRenderTarget(GLenum renderTarget) {
147 this->renderTarget = renderTarget;
148 }
149
150 void setWrap(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false) {
Romain Guye3c26852011-07-25 16:36:01 -0700151 texture.setWrap(wrapS, wrapT, bindTexture, force, renderTarget);
Romain Guy9ace8f52011-07-07 20:50:11 -0700152 }
153
154 void setFilter(GLenum min, GLenum mag, bool bindTexture = false, bool force = false) {
Romain Guye3c26852011-07-25 16:36:01 -0700155 texture.setFilter(min, mag,bindTexture, force, renderTarget);
Romain Guy9ace8f52011-07-07 20:50:11 -0700156 }
157
158 inline bool isCacheable() {
159 return cacheable;
160 }
161
162 inline void setCacheable(bool cacheable) {
163 this->cacheable = cacheable;
164 }
165
166 inline bool isTextureLayer() {
167 return textureLayer;
168 }
169
170 inline void setTextureLayer(bool textureLayer) {
171 this->textureLayer = textureLayer;
172 }
173
174 inline SkiaColorFilter* getColorFilter() {
175 return colorFilter;
176 }
177
178 inline void setColorFilter(SkiaColorFilter* filter) {
179 colorFilter = filter;
180 }
181
182 inline void bindTexture() {
183 glBindTexture(renderTarget, texture.id);
184 }
185
186 inline void generateTexture() {
187 glGenTextures(1, &texture.id);
188 }
189
190 inline void deleteTexture() {
191 if (texture.id) glDeleteTextures(1, &texture.id);
192 }
193
194 inline void allocateTexture(GLenum format, GLenum storage) {
195 glTexImage2D(renderTarget, 0, format, getWidth(), getHeight(), 0, format, storage, NULL);
196 }
197
198 inline mat4& getTexTransform() {
199 return texTransform;
Romain Guy9fc27812011-04-27 14:21:41 -0700200 }
201
202 /**
Romain Guy8550c4c2010-10-08 15:49:53 -0700203 * Bounds of the layer.
Romain Guydda570202010-07-06 11:39:32 -0700204 */
205 Rect layer;
206 /**
Romain Guy8550c4c2010-10-08 15:49:53 -0700207 * Texture coordinates of the layer.
Romain Guydda570202010-07-06 11:39:32 -0700208 */
Romain Guy8550c4c2010-10-08 15:49:53 -0700209 Rect texCoords;
210
Romain Guydda570202010-07-06 11:39:32 -0700211 /**
Romain Guy5b3b3522010-10-27 18:57:51 -0700212 * Dirty region indicating what parts of the layer
213 * have been drawn.
214 */
215 Region region;
Romain Guy40667672011-03-18 14:34:03 -0700216 /**
217 * If the region is a rectangle, coordinates of the
218 * region are stored here.
219 */
220 Rect regionRect;
Romain Guy171c5922011-01-06 10:04:23 -0800221
222 /**
Romain Guyf219da52011-01-16 12:54:25 -0800223 * If the layer can be rendered as a mesh, this is non-null.
224 */
225 TextureVertex* mesh;
226 uint16_t* meshIndices;
227 GLsizei meshElementCount;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700228
Romain Guy9ace8f52011-07-07 20:50:11 -0700229private:
230 /**
231 * Name of the FBO used to render the layer. If the name is 0
232 * this layer is not backed by an FBO, but a simple texture.
233 */
234 GLuint fbo;
235
236 /**
237 * Indicates whether this layer has been used already.
238 */
239 bool empty;
240
241 /**
242 * The texture backing this layer.
243 */
244 Texture texture;
245
Romain Guyaa6c24c2011-04-28 18:40:04 -0700246 /**
247 * If set to true (by default), the layer can be reused.
248 */
Romain Guy9ace8f52011-07-07 20:50:11 -0700249 bool cacheable;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700250
251 /**
252 * When set to true, this layer must be treated as a texture
253 * layer.
254 */
Romain Guy9ace8f52011-07-07 20:50:11 -0700255 bool textureLayer;
256
257 /**
258 * Indicates the render target.
259 */
260 GLenum renderTarget;
261
262 /**
263 * Color filter used to draw this layer. Optional.
264 */
265 SkiaColorFilter* colorFilter;
266
267 /**
268 * Opacity of the layer.
269 */
270 int alpha;
271 /**
272 * Blending mode of the layer.
273 */
274 SkXfermode::Mode mode;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700275
276 /**
277 * Optional texture coordinates transform.
278 */
279 mat4 texTransform;
Romain Guy8f0095c2011-05-02 17:24:22 -0700280
Romain Guydda570202010-07-06 11:39:32 -0700281}; // struct Layer
282
283}; // namespace uirenderer
284}; // namespace android
285
Romain Guy5b3b3522010-10-27 18:57:51 -0700286#endif // ANDROID_HWUI_LAYER_H