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