Home | History | Annotate | Download | only in opengl
      1 /*
      2  * Copyright (C) 2006 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 package android.opengl;
     18 
     19 import android.graphics.Bitmap;
     20 
     21 import javax.microedition.khronos.egl.EGL10;
     22 import javax.microedition.khronos.egl.EGL11;
     23 
     24 /**
     25  *
     26  * Utility class to help bridging OpenGL ES and Android APIs.
     27  *
     28  */
     29 
     30 public final class GLUtils {
     31 
     32     private GLUtils() {
     33     }
     34 
     35     /**
     36      * return the internal format as defined by OpenGL ES of the supplied bitmap.
     37      * @param bitmap
     38      * @return the internal format of the bitmap.
     39      */
     40     public static int getInternalFormat(Bitmap bitmap) {
     41         if (bitmap == null) {
     42             throw new NullPointerException("getInternalFormat can't be used with a null Bitmap");
     43         }
     44         if (bitmap.isRecycled()) {
     45             throw new IllegalArgumentException("bitmap is recycled");
     46         }
     47         int result = native_getInternalFormat(bitmap);
     48         if (result < 0) {
     49             throw new IllegalArgumentException("Unknown internalformat");
     50         }
     51         return result;
     52     }
     53 
     54     /**
     55      * Return the type as defined by OpenGL ES of the supplied bitmap, if there
     56      * is one. If the bitmap is stored in a compressed format, it may not have
     57      * a valid OpenGL ES type.
     58      * @throws IllegalArgumentException if the bitmap does not have a type.
     59      * @param bitmap
     60      * @return the OpenGL ES type of the bitmap.
     61      */
     62     public static int getType(Bitmap bitmap) {
     63         if (bitmap == null) {
     64             throw new NullPointerException("getType can't be used with a null Bitmap");
     65         }
     66         if (bitmap.isRecycled()) {
     67             throw new IllegalArgumentException("bitmap is recycled");
     68         }
     69         int result = native_getType(bitmap);
     70         if (result < 0) {
     71             throw new IllegalArgumentException("Unknown type");
     72         }
     73         return result;
     74     }
     75 
     76     /**
     77      * Calls glTexImage2D() on the current OpenGL context. If no context is
     78      * current the behavior is the same as calling glTexImage2D() with  no
     79      * current context, that is, eglGetError() will return the appropriate
     80      * error.
     81      * Unlike glTexImage2D() bitmap cannot be null and will raise an exception
     82      * in that case.
     83      * All other parameters are identical to those used for glTexImage2D().
     84      *
     85      * NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make
     86      * sure to set it properly according to the supplied bitmap.
     87      *
     88      * Whether or not bitmap can have non power of two dimensions depends on
     89      * the current OpenGL context. Always check glGetError() some time
     90      * after calling this method, just like when using OpenGL directly.
     91      *
     92      * @param target
     93      * @param level
     94      * @param internalformat
     95      * @param bitmap
     96      * @param border
     97      */
     98     public static void texImage2D(int target, int level, int internalformat,
     99             Bitmap bitmap, int border) {
    100         if (bitmap == null) {
    101             throw new NullPointerException("texImage2D can't be used with a null Bitmap");
    102         }
    103         if (bitmap.isRecycled()) {
    104             throw new IllegalArgumentException("bitmap is recycled");
    105         }
    106         if (native_texImage2D(target, level, internalformat, bitmap, -1, border)!=0) {
    107             throw new IllegalArgumentException("invalid Bitmap format");
    108         }
    109     }
    110 
    111     /**
    112      * A version of texImage2D() that takes an explicit type parameter
    113      * as defined by the OpenGL ES specification. The actual type and
    114      * internalformat of the bitmap must be compatible with the specified
    115      * type and internalformat parameters.
    116      *
    117      * @param target
    118      * @param level
    119      * @param internalformat
    120      * @param bitmap
    121      * @param type
    122      * @param border
    123      */
    124     public static void texImage2D(int target, int level, int internalformat,
    125             Bitmap bitmap, int type, int border) {
    126         if (bitmap == null) {
    127             throw new NullPointerException("texImage2D can't be used with a null Bitmap");
    128         }
    129         if (bitmap.isRecycled()) {
    130             throw new IllegalArgumentException("bitmap is recycled");
    131         }
    132         if (native_texImage2D(target, level, internalformat, bitmap, type, border)!=0) {
    133             throw new IllegalArgumentException("invalid Bitmap format");
    134         }
    135     }
    136 
    137     /**
    138      * A version of texImage2D that determines the internalFormat and type
    139      * automatically.
    140      *
    141      * @param target
    142      * @param level
    143      * @param bitmap
    144      * @param border
    145      */
    146     public static void texImage2D(int target, int level, Bitmap bitmap,
    147             int border) {
    148         if (bitmap == null) {
    149             throw new NullPointerException("texImage2D can't be used with a null Bitmap");
    150         }
    151         if (bitmap.isRecycled()) {
    152             throw new IllegalArgumentException("bitmap is recycled");
    153         }
    154         if (native_texImage2D(target, level, -1, bitmap, -1, border)!=0) {
    155             throw new IllegalArgumentException("invalid Bitmap format");
    156         }
    157     }
    158 
    159     /**
    160      * Calls glTexSubImage2D() on the current OpenGL context. If no context is
    161      * current the behavior is the same as calling glTexSubImage2D() with  no
    162      * current context, that is, eglGetError() will return the appropriate
    163      * error.
    164      * Unlike glTexSubImage2D() bitmap cannot be null and will raise an exception
    165      * in that case.
    166      * All other parameters are identical to those used for glTexSubImage2D().
    167      *
    168      * NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make
    169      * sure to set it properly according to the supplied bitmap.
    170      *
    171      * Whether or not bitmap can have non power of two dimensions depends on
    172      * the current OpenGL context. Always check glGetError() some time
    173      * after calling this method, just like when using OpenGL directly.
    174      *
    175      * @param target
    176      * @param level
    177      * @param xoffset
    178      * @param yoffset
    179      * @param bitmap
    180      */
    181     public static void texSubImage2D(int target, int level, int xoffset, int yoffset,
    182             Bitmap bitmap) {
    183         if (bitmap == null) {
    184             throw new NullPointerException("texSubImage2D can't be used with a null Bitmap");
    185         }
    186         if (bitmap.isRecycled()) {
    187             throw new IllegalArgumentException("bitmap is recycled");
    188         }
    189         int type = getType(bitmap);
    190         if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, -1, type)!=0) {
    191             throw new IllegalArgumentException("invalid Bitmap format");
    192         }
    193     }
    194 
    195     /**
    196      * A version of texSubImage2D() that takes an explicit type parameter
    197      * as defined by the OpenGL ES specification.
    198      *
    199      * @param target
    200      * @param level
    201      * @param xoffset
    202      * @param yoffset
    203      * @param bitmap
    204      * @param type
    205      */
    206     public static void texSubImage2D(int target, int level, int xoffset, int yoffset,
    207             Bitmap bitmap, int format, int type) {
    208         if (bitmap == null) {
    209             throw new NullPointerException("texSubImage2D can't be used with a null Bitmap");
    210         }
    211         if (bitmap.isRecycled()) {
    212             throw new IllegalArgumentException("bitmap is recycled");
    213         }
    214         if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, format, type)!=0) {
    215             throw new IllegalArgumentException("invalid Bitmap format");
    216         }
    217     }
    218 
    219     /**
    220      * Return a string for the EGL error code, or the hex representation
    221      * if the error is unknown.
    222      *
    223      * @param error The EGL error to convert into a String.
    224      *
    225      * @return An error string corresponding to the EGL error code.
    226      */
    227     public static String getEGLErrorString(int error) {
    228         switch (error) {
    229             case EGL10.EGL_SUCCESS:
    230                 return "EGL_SUCCESS";
    231             case EGL10.EGL_NOT_INITIALIZED:
    232                 return "EGL_NOT_INITIALIZED";
    233             case EGL10.EGL_BAD_ACCESS:
    234                 return "EGL_BAD_ACCESS";
    235             case EGL10.EGL_BAD_ALLOC:
    236                 return "EGL_BAD_ALLOC";
    237             case EGL10.EGL_BAD_ATTRIBUTE:
    238                 return "EGL_BAD_ATTRIBUTE";
    239             case EGL10.EGL_BAD_CONFIG:
    240                 return "EGL_BAD_CONFIG";
    241             case EGL10.EGL_BAD_CONTEXT:
    242                 return "EGL_BAD_CONTEXT";
    243             case EGL10.EGL_BAD_CURRENT_SURFACE:
    244                 return "EGL_BAD_CURRENT_SURFACE";
    245             case EGL10.EGL_BAD_DISPLAY:
    246                 return "EGL_BAD_DISPLAY";
    247             case EGL10.EGL_BAD_MATCH:
    248                 return "EGL_BAD_MATCH";
    249             case EGL10.EGL_BAD_NATIVE_PIXMAP:
    250                 return "EGL_BAD_NATIVE_PIXMAP";
    251             case EGL10.EGL_BAD_NATIVE_WINDOW:
    252                 return "EGL_BAD_NATIVE_WINDOW";
    253             case EGL10.EGL_BAD_PARAMETER:
    254                 return "EGL_BAD_PARAMETER";
    255             case EGL10.EGL_BAD_SURFACE:
    256                 return "EGL_BAD_SURFACE";
    257             case EGL11.EGL_CONTEXT_LOST:
    258                 return "EGL_CONTEXT_LOST";
    259             default:
    260                 return "0x" + Integer.toHexString(error);
    261         }
    262     }
    263 
    264     native private static int native_getInternalFormat(Bitmap bitmap);
    265     native private static int native_getType(Bitmap bitmap);
    266     native private static int native_texImage2D(int target, int level, int internalformat,
    267             Bitmap bitmap, int type, int border);
    268     native private static int native_texSubImage2D(int target, int level, int xoffset, int yoffset,
    269             Bitmap bitmap, int format, int type);
    270 }
    271