Texture.h revision e3c26851dc315b730ea0fe5ef35bb1db81f6d675
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
25ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/**
26ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Represents an OpenGL texture.
27ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */
28ce0537b80087a6225273040a987414b1dd081aa0Romain Guystruct Texture {
2922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    Texture() {
3022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        cleanup = false;
319aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy        bitmapSize = 0;
329ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
338164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy        wrapS = GL_CLAMP_TO_EDGE;
348164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy        wrapT = GL_CLAMP_TO_EDGE;
359ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
369ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy        minFilter = GL_NEAREST;
379ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy        magFilter = GL_NEAREST;
38e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
39e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        firstFilter = true;
40e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        firstWrap = true;
419ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    }
429ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
43e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy    void setWrap(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false,
44e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            GLenum renderTarget = GL_TEXTURE_2D) {
45e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
46e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) {
47e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            firstWrap = true;
48e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
49e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            this->wrapS = wrapS;
50e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            this->wrapT = wrapT;
51e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
52e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            if (bindTexture) {
53e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy                glBindTexture(renderTarget, id);
54e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            }
55e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
56e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_S, wrapS);
57e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_WRAP_T, wrapT);
58e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        }
599ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    }
609ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
61e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy    void setFilter(GLenum min, GLenum mag, bool bindTexture = false, bool force = false,
62e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            GLenum renderTarget = GL_TEXTURE_2D) {
63e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
64e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        if (firstFilter || force || min != minFilter || mag != magFilter) {
65e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            firstFilter = false;
66e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
67e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            minFilter = min;
68e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            magFilter = mag;
69e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
70e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            if (bindTexture) {
71e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy                glBindTexture(renderTarget, id);
72e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            }
73e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
74e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_MIN_FILTER, min);
75e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy            glTexParameteri(renderTarget, GL_TEXTURE_MAG_FILTER, mag);
76e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy        }
7722158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    }
7822158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
79ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
80ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Name of the texture.
81ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
82ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    GLuint id;
83ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
84fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy     * Generation of the backing bitmap,
85fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy     */
86fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy    uint32_t generation;
87fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy    /**
88ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Indicates whether the texture requires blending.
89ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
90ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    bool blend;
91ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
92ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Width of the backing bitmap.
93ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
947d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy    uint32_t width;
95ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
96ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Height of the backing bitmap.
97ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
987d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy    uint32_t height;
9922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    /**
10022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy     * Indicates whether this texture should be cleaned up after use.
10122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy     */
10222158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    bool cleanup;
1039aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy    /**
1049aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy     * Optional, size of the original bitmap.
1059aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy     */
1069aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy    uint32_t bitmapSize;
1078164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy
1088164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    /**
1098164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy     * Last wrap modes set on this texture. Defaults to GL_CLAMP_TO_EDGE.
1108164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy     */
1118164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    GLenum wrapS;
1128164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    GLenum wrapT;
1139ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
1149ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    /**
1159ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy     * Last filters set on this texture. Defaults to GL_NEAREST.
1169ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy     */
1179ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    GLenum minFilter;
1189ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    GLenum magFilter;
119e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
120e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guyprivate:
121e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy    bool firstFilter;
122e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy    bool firstWrap;
123ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // struct Texture
124ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
12522158e139a3d6c6a9787ca0de224e9368f643284Romain Guyclass AutoTexture {
12622158e139a3d6c6a9787ca0de224e9368f643284Romain Guypublic:
12722158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    AutoTexture(const Texture* texture): mTexture(texture) { }
12822158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    ~AutoTexture() {
12922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        if (mTexture && mTexture->cleanup) {
13022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy            glDeleteTextures(1, &mTexture->id);
13122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy            delete mTexture;
13222158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        }
13322158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    }
13422158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
13522158e139a3d6c6a9787ca0de224e9368f643284Romain Guyprivate:
13622158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    const Texture* mTexture;
13722158e139a3d6c6a9787ca0de224e9368f643284Romain Guy}; // class AutoTexture
13822158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
139ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer
140ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android
141ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
1425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_TEXTURE_H
143