Texture.h revision 3b748a44c6bd2ea05fe16839caf73dbe50bd7ae9
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_TEXTURE_H
18#define ANDROID_HWUI_TEXTURE_H
19
20#include <GLES2/gl2.h>
21
22namespace android {
23namespace uirenderer {
24
25class UvMapper;
26
27/**
28 * Represents an OpenGL texture.
29 */
30struct Texture {
31    Texture() {
32        cleanup = false;
33        bitmapSize = 0;
34
35        wrapS = GL_CLAMP_TO_EDGE;
36        wrapT = GL_CLAMP_TO_EDGE;
37
38        minFilter = GL_NEAREST;
39        magFilter = GL_NEAREST;
40
41        mipMap = false;
42
43        firstFilter = true;
44        firstWrap = true;
45
46        id = 0;
47
48        uvMapper = NULL;
49    }
50
51    void setWrap(GLenum wrap, bool bindTexture = false, bool force = false,
52                GLenum renderTarget = GL_TEXTURE_2D) {
53        setWrapST(wrap, wrap, bindTexture, force, renderTarget);
54    }
55
56    void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false,
57            GLenum renderTarget = GL_TEXTURE_2D) {
58
59        if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) {
60            firstWrap = false;
61
62            this->wrapS = wrapS;
63            this->wrapT = wrapT;
64
65            if (bindTexture) {
66                glBindTexture(renderTarget, id);
67            }
68
69            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_S, wrapS);
70            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_T, wrapT);
71        }
72    }
73
74    void setFilter(GLenum filter, bool bindTexture = false, bool force = false,
75                GLenum renderTarget = GL_TEXTURE_2D) {
76        setFilterMinMag(filter, filter, bindTexture, force, renderTarget);
77    }
78
79    void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false, bool force = false,
80            GLenum renderTarget = GL_TEXTURE_2D) {
81
82        if (firstFilter || force || min != minFilter || mag != magFilter) {
83            firstFilter = false;
84
85            minFilter = min;
86            magFilter = mag;
87
88            if (bindTexture) {
89                glBindTexture(renderTarget, id);
90            }
91
92            if (mipMap && min == GL_LINEAR) min = GL_LINEAR_MIPMAP_LINEAR;
93
94            glTexParameteri(renderTarget, GL_TEXTURE_MIN_FILTER, min);
95            glTexParameteri(renderTarget, GL_TEXTURE_MAG_FILTER, mag);
96        }
97    }
98
99    /**
100     * Name of the texture.
101     */
102    GLuint id;
103    /**
104     * Generation of the backing bitmap,
105     */
106    uint32_t generation;
107    /**
108     * Indicates whether the texture requires blending.
109     */
110    bool blend;
111    /**
112     * Width of the backing bitmap.
113     */
114    uint32_t width;
115    /**
116     * Height of the backing bitmap.
117     */
118    uint32_t height;
119    /**
120     * Indicates whether this texture should be cleaned up after use.
121     */
122    bool cleanup;
123    /**
124     * Optional, size of the original bitmap.
125     */
126    uint32_t bitmapSize;
127    /**
128     * Indicates whether this texture will use trilinear filtering.
129     */
130    bool mipMap;
131
132    /**
133     * Optional, pointer to a texture coordinates mapper.
134     */
135    const UvMapper* uvMapper;
136
137private:
138    /**
139     * Last wrap modes set on this texture. Defaults to GL_CLAMP_TO_EDGE.
140     */
141    GLenum wrapS;
142    GLenum wrapT;
143
144    /**
145     * Last filters set on this texture. Defaults to GL_NEAREST.
146     */
147    GLenum minFilter;
148    GLenum magFilter;
149
150    bool firstFilter;
151    bool firstWrap;
152}; // struct Texture
153
154class AutoTexture {
155public:
156    AutoTexture(const Texture* texture): mTexture(texture) { }
157    ~AutoTexture() {
158        if (mTexture && mTexture->cleanup) {
159            glDeleteTextures(1, &mTexture->id);
160            delete mTexture;
161        }
162    }
163
164private:
165    const Texture* mTexture;
166}; // class AutoTexture
167
168}; // namespace uirenderer
169}; // namespace android
170
171#endif // ANDROID_HWUI_TEXTURE_H
172