Texture.h revision 3b748a44c6bd2ea05fe16839caf73dbe50bd7ae9
1ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/*
2ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Copyright (C) 2010 The Android Open Source Project
3ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *
4ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * you may not use this file except in compliance with the License.
6ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * You may obtain a copy of the License at
7ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *
8ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *
10ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Unless required by applicable law or agreed to in writing, software
11ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * See the License for the specific language governing permissions and
14ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * limitations under the License.
15ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */
16ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_TEXTURE_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_TEXTURE_H
19ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
20ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <GLES2/gl2.h>
21ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
22ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace android {
23ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace uirenderer {
24ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyclass UvMapper;
263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
27ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/**
28ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Represents an OpenGL texture.
29ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */
30ce0537b80087a6225273040a987414b1dd081aa0Romain Guystruct Texture {
3122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    Texture() {
3222158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        cleanup = false;
339aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy        bitmapSize = 0;
349ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
358164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy        wrapS = GL_CLAMP_TO_EDGE;
368164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy        wrapT = GL_CLAMP_TO_EDGE;
379ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
389ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy        minFilter = GL_NEAREST;
399ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy        magFilter = GL_NEAREST;
40e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
41713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy        mipMap = false;
42713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy
43e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        firstFilter = true;
44e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        firstWrap = true;
4598d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase
4698d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase        id = 0;
473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        uvMapper = NULL;
499ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    }
509ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
51d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    void setWrap(GLenum wrap, bool bindTexture = false, bool force = false,
52d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy                GLenum renderTarget = GL_TEXTURE_2D) {
53d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy        setWrapST(wrap, wrap, bindTexture, force, renderTarget);
54d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    }
55d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy
56d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false,
57e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            GLenum renderTarget = GL_TEXTURE_2D) {
58e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
59e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) {
6039d252a6632d057d5077f7eaf1b8ed7a142f3397Romain Guy            firstWrap = false;
61e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
62e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            this->wrapS = wrapS;
63e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            this->wrapT = wrapT;
64e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
65e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            if (bindTexture) {
66e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy                glBindTexture(renderTarget, id);
67e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            }
68e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
69e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_S, wrapS);
70e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_T, wrapT);
71e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        }
729ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    }
739ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
74d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    void setFilter(GLenum filter, bool bindTexture = false, bool force = false,
75d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy                GLenum renderTarget = GL_TEXTURE_2D) {
76d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy        setFilterMinMag(filter, filter, bindTexture, force, renderTarget);
77d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    }
78d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy
79d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false, bool force = false,
80e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            GLenum renderTarget = GL_TEXTURE_2D) {
81e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
82e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        if (firstFilter || force || min != minFilter || mag != magFilter) {
83e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            firstFilter = false;
84e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
85e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            minFilter = min;
86e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            magFilter = mag;
87e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
88e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            if (bindTexture) {
89e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy                glBindTexture(renderTarget, id);
90e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            }
91e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
92713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy            if (mipMap && min == GL_LINEAR) min = GL_LINEAR_MIPMAP_LINEAR;
93713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy
94e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_MIN_FILTER, min);
95e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_MAG_FILTER, mag);
96e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        }
9722158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    }
9822158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
99ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
100ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Name of the texture.
101ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
102ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    GLuint id;
103ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
104fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy     * Generation of the backing bitmap,
105fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy     */
106fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy    uint32_t generation;
107fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy    /**
108ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Indicates whether the texture requires blending.
109ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
110ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    bool blend;
111ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
112ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Width of the backing bitmap.
113ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
1147d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy    uint32_t width;
115ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
116ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Height of the backing bitmap.
117ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
1187d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy    uint32_t height;
11922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    /**
12022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy     * Indicates whether this texture should be cleaned up after use.
12122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy     */
12222158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    bool cleanup;
1239aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy    /**
1249aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy     * Optional, size of the original bitmap.
1259aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy     */
1269aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy    uint32_t bitmapSize;
127713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy    /**
128713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy     * Indicates whether this texture will use trilinear filtering.
129713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy     */
130713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy    bool mipMap;
1318164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy
1323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    /**
1333b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * Optional, pointer to a texture coordinates mapper.
1343b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     */
1353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    const UvMapper* uvMapper;
1363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
137713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guyprivate:
1388164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    /**
1398164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy     * Last wrap modes set on this texture. Defaults to GL_CLAMP_TO_EDGE.
1408164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy     */
1418164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    GLenum wrapS;
1428164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    GLenum wrapT;
1439ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
1449ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    /**
1459ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy     * Last filters set on this texture. Defaults to GL_NEAREST.
1469ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy     */
1479ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    GLenum minFilter;
1489ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    GLenum magFilter;
149e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
150e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy    bool firstFilter;
151e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy    bool firstWrap;
152ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // struct Texture
153ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
15422158e139a3d6c6a9787ca0de224e9368f643284Romain Guyclass AutoTexture {
15522158e139a3d6c6a9787ca0de224e9368f643284Romain Guypublic:
15622158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    AutoTexture(const Texture* texture): mTexture(texture) { }
15722158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    ~AutoTexture() {
15822158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        if (mTexture && mTexture->cleanup) {
15922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy            glDeleteTextures(1, &mTexture->id);
16022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy            delete mTexture;
16122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        }
16222158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    }
16322158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
16422158e139a3d6c6a9787ca0de224e9368f643284Romain Guyprivate:
16522158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    const Texture* mTexture;
16622158e139a3d6c6a9787ca0de224e9368f643284Romain Guy}; // class AutoTexture
16722158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
168ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer
169ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android
170ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
1715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_TEXTURE_H
172