Texture.h revision e3c26851dc315b730ea0fe5ef35bb1db81f6d675
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
25/**
26 * Represents an OpenGL texture.
27 */
28struct Texture {
29    Texture() {
30        cleanup = false;
31        bitmapSize = 0;
32
33        wrapS = GL_CLAMP_TO_EDGE;
34        wrapT = GL_CLAMP_TO_EDGE;
35
36        minFilter = GL_NEAREST;
37        magFilter = GL_NEAREST;
38
39        firstFilter = true;
40        firstWrap = true;
41    }
42
43    void setWrap(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false,
44            GLenum renderTarget = GL_TEXTURE_2D) {
45
46        if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) {
47            firstWrap = true;
48
49            this->wrapS = wrapS;
50            this->wrapT = wrapT;
51
52            if (bindTexture) {
53                glBindTexture(renderTarget, id);
54            }
55
56            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_S, wrapS);
57            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_T, wrapT);
58        }
59    }
60
61    void setFilter(GLenum min, GLenum mag, bool bindTexture = false, bool force = false,
62            GLenum renderTarget = GL_TEXTURE_2D) {
63
64        if (firstFilter || force || min != minFilter || mag != magFilter) {
65            firstFilter = false;
66
67            minFilter = min;
68            magFilter = mag;
69
70            if (bindTexture) {
71                glBindTexture(renderTarget, id);
72            }
73
74            glTexParameteri(renderTarget, GL_TEXTURE_MIN_FILTER, min);
75            glTexParameteri(renderTarget, GL_TEXTURE_MAG_FILTER, mag);
76        }
77    }
78
79    /**
80     * Name of the texture.
81     */
82    GLuint id;
83    /**
84     * Generation of the backing bitmap,
85     */
86    uint32_t generation;
87    /**
88     * Indicates whether the texture requires blending.
89     */
90    bool blend;
91    /**
92     * Width of the backing bitmap.
93     */
94    uint32_t width;
95    /**
96     * Height of the backing bitmap.
97     */
98    uint32_t height;
99    /**
100     * Indicates whether this texture should be cleaned up after use.
101     */
102    bool cleanup;
103    /**
104     * Optional, size of the original bitmap.
105     */
106    uint32_t bitmapSize;
107
108    /**
109     * Last wrap modes set on this texture. Defaults to GL_CLAMP_TO_EDGE.
110     */
111    GLenum wrapS;
112    GLenum wrapT;
113
114    /**
115     * Last filters set on this texture. Defaults to GL_NEAREST.
116     */
117    GLenum minFilter;
118    GLenum magFilter;
119
120private:
121    bool firstFilter;
122    bool firstWrap;
123}; // struct Texture
124
125class AutoTexture {
126public:
127    AutoTexture(const Texture* texture): mTexture(texture) { }
128    ~AutoTexture() {
129        if (mTexture && mTexture->cleanup) {
130            glDeleteTextures(1, &mTexture->id);
131            delete mTexture;
132        }
133    }
134
135private:
136    const Texture* mTexture;
137}; // class AutoTexture
138
139}; // namespace uirenderer
140}; // namespace android
141
142#endif // ANDROID_HWUI_TEXTURE_H
143