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