Texture.h revision 713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5
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