Home | History | Annotate | Download | only in hwui
      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 
     22 namespace android {
     23 namespace uirenderer {
     24 
     25 /**
     26  * Represents an OpenGL texture.
     27  */
     28 struct 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         firstFilter = true;
     40         firstWrap = true;
     41     }
     42 
     43     void setWrap(GLenum wrap, bool bindTexture = false, bool force = false,
     44                 GLenum renderTarget = GL_TEXTURE_2D) {
     45         setWrapST(wrap, wrap, bindTexture, force, renderTarget);
     46     }
     47 
     48     void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false,
     49             GLenum renderTarget = GL_TEXTURE_2D) {
     50 
     51         if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) {
     52             firstWrap = false;
     53 
     54             this->wrapS = wrapS;
     55             this->wrapT = wrapT;
     56 
     57             if (bindTexture) {
     58                 glBindTexture(renderTarget, id);
     59             }
     60 
     61             glTexParameteri(renderTarget, GL_TEXTURE_WRAP_S, wrapS);
     62             glTexParameteri(renderTarget, GL_TEXTURE_WRAP_T, wrapT);
     63         }
     64     }
     65 
     66     void setFilter(GLenum filter, bool bindTexture = false, bool force = false,
     67                 GLenum renderTarget = GL_TEXTURE_2D) {
     68         setFilterMinMag(filter, filter, bindTexture, force, renderTarget);
     69     }
     70 
     71     void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false, bool force = false,
     72             GLenum renderTarget = GL_TEXTURE_2D) {
     73 
     74         if (firstFilter || force || min != minFilter || mag != magFilter) {
     75             firstFilter = false;
     76 
     77             minFilter = min;
     78             magFilter = mag;
     79 
     80             if (bindTexture) {
     81                 glBindTexture(renderTarget, id);
     82             }
     83 
     84             glTexParameteri(renderTarget, GL_TEXTURE_MIN_FILTER, min);
     85             glTexParameteri(renderTarget, GL_TEXTURE_MAG_FILTER, mag);
     86         }
     87     }
     88 
     89     /**
     90      * Name of the texture.
     91      */
     92     GLuint id;
     93     /**
     94      * Generation of the backing bitmap,
     95      */
     96     uint32_t generation;
     97     /**
     98      * Indicates whether the texture requires blending.
     99      */
    100     bool blend;
    101     /**
    102      * Width of the backing bitmap.
    103      */
    104     uint32_t width;
    105     /**
    106      * Height of the backing bitmap.
    107      */
    108     uint32_t height;
    109     /**
    110      * Indicates whether this texture should be cleaned up after use.
    111      */
    112     bool cleanup;
    113     /**
    114      * Optional, size of the original bitmap.
    115      */
    116     uint32_t bitmapSize;
    117 
    118     /**
    119      * Last wrap modes set on this texture. Defaults to GL_CLAMP_TO_EDGE.
    120      */
    121     GLenum wrapS;
    122     GLenum wrapT;
    123 
    124     /**
    125      * Last filters set on this texture. Defaults to GL_NEAREST.
    126      */
    127     GLenum minFilter;
    128     GLenum magFilter;
    129 
    130 private:
    131     bool firstFilter;
    132     bool firstWrap;
    133 }; // struct Texture
    134 
    135 class AutoTexture {
    136 public:
    137     AutoTexture(const Texture* texture): mTexture(texture) { }
    138     ~AutoTexture() {
    139         if (mTexture && mTexture->cleanup) {
    140             glDeleteTextures(1, &mTexture->id);
    141             delete mTexture;
    142         }
    143     }
    144 
    145 private:
    146     const Texture* mTexture;
    147 }; // class AutoTexture
    148 
    149 }; // namespace uirenderer
    150 }; // namespace android
    151 
    152 #endif // ANDROID_HWUI_TEXTURE_H
    153