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