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