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