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