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