|  | /* | 
|  | * Copyright (C) 2006 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.opengl; | 
|  |  | 
|  | import android.graphics.Bitmap; | 
|  |  | 
|  | import javax.microedition.khronos.egl.EGL10; | 
|  | import javax.microedition.khronos.egl.EGL11; | 
|  |  | 
|  | /** | 
|  | * | 
|  | * Utility class to help bridging OpenGL ES and Android APIs. | 
|  | * | 
|  | */ | 
|  |  | 
|  | public final class GLUtils { | 
|  |  | 
|  | private GLUtils() { | 
|  | } | 
|  |  | 
|  | /** | 
|  | * return the internal format as defined by OpenGL ES of the supplied bitmap. | 
|  | * @param bitmap | 
|  | * @return the internal format of the bitmap. | 
|  | */ | 
|  | public static int getInternalFormat(Bitmap bitmap) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("getInternalFormat can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | int result = native_getInternalFormat(bitmap); | 
|  | if (result < 0) { | 
|  | throw new IllegalArgumentException("Unknown internalformat"); | 
|  | } | 
|  | return result; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Return the type as defined by OpenGL ES of the supplied bitmap, if there | 
|  | * is one. If the bitmap is stored in a compressed format, it may not have | 
|  | * a valid OpenGL ES type. | 
|  | * @throws IllegalArgumentException if the bitmap does not have a type. | 
|  | * @param bitmap | 
|  | * @return the OpenGL ES type of the bitmap. | 
|  | */ | 
|  | public static int getType(Bitmap bitmap) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("getType can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | int result = native_getType(bitmap); | 
|  | if (result < 0) { | 
|  | throw new IllegalArgumentException("Unknown type"); | 
|  | } | 
|  | return result; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Calls glTexImage2D() on the current OpenGL context. If no context is | 
|  | * current the behavior is the same as calling glTexImage2D() with  no | 
|  | * current context, that is, eglGetError() will return the appropriate | 
|  | * error. | 
|  | * Unlike glTexImage2D() bitmap cannot be null and will raise an exception | 
|  | * in that case. | 
|  | * All other parameters are identical to those used for glTexImage2D(). | 
|  | * | 
|  | * NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make | 
|  | * sure to set it properly according to the supplied bitmap. | 
|  | * | 
|  | * Whether or not bitmap can have non power of two dimensions depends on | 
|  | * the current OpenGL context. Always check glGetError() some time | 
|  | * after calling this method, just like when using OpenGL directly. | 
|  | * | 
|  | * @param target | 
|  | * @param level | 
|  | * @param internalformat | 
|  | * @param bitmap | 
|  | * @param border | 
|  | */ | 
|  | public static void texImage2D(int target, int level, int internalformat, | 
|  | Bitmap bitmap, int border) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("texImage2D can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | if (native_texImage2D(target, level, internalformat, bitmap, -1, border) != 0) { | 
|  | throw new IllegalArgumentException("invalid Bitmap format"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * A version of texImage2D() that takes an explicit type parameter | 
|  | * as defined by the OpenGL ES specification. The actual type and | 
|  | * internalformat of the bitmap must be compatible with the specified | 
|  | * type and internalformat parameters. | 
|  | * | 
|  | * @param target | 
|  | * @param level | 
|  | * @param internalformat | 
|  | * @param bitmap | 
|  | * @param type | 
|  | * @param border | 
|  | */ | 
|  | public static void texImage2D(int target, int level, int internalformat, | 
|  | Bitmap bitmap, int type, int border) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("texImage2D can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | if (native_texImage2D(target, level, internalformat, bitmap, type, border) != 0) { | 
|  | throw new IllegalArgumentException("invalid Bitmap format"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * A version of texImage2D that determines the internalFormat and type | 
|  | * automatically. | 
|  | * | 
|  | * @param target | 
|  | * @param level | 
|  | * @param bitmap | 
|  | * @param border | 
|  | */ | 
|  | public static void texImage2D(int target, int level, Bitmap bitmap, | 
|  | int border) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("texImage2D can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | if (native_texImage2D(target, level, -1, bitmap, -1, border) != 0) { | 
|  | throw new IllegalArgumentException("invalid Bitmap format"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Calls glTexSubImage2D() on the current OpenGL context. If no context is | 
|  | * current the behavior is the same as calling glTexSubImage2D() with  no | 
|  | * current context, that is, eglGetError() will return the appropriate | 
|  | * error. | 
|  | * Unlike glTexSubImage2D() bitmap cannot be null and will raise an exception | 
|  | * in that case. | 
|  | * All other parameters are identical to those used for glTexSubImage2D(). | 
|  | * | 
|  | * NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make | 
|  | * sure to set it properly according to the supplied bitmap. | 
|  | * | 
|  | * Whether or not bitmap can have non power of two dimensions depends on | 
|  | * the current OpenGL context. Always check glGetError() some time | 
|  | * after calling this method, just like when using OpenGL directly. | 
|  | * | 
|  | * @param target | 
|  | * @param level | 
|  | * @param xoffset | 
|  | * @param yoffset | 
|  | * @param bitmap | 
|  | */ | 
|  | public static void texSubImage2D(int target, int level, int xoffset, int yoffset, | 
|  | Bitmap bitmap) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("texSubImage2D can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | int type = getType(bitmap); | 
|  | if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, -1, type) != 0) { | 
|  | throw new IllegalArgumentException("invalid Bitmap format"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * A version of texSubImage2D() that takes an explicit type parameter | 
|  | * as defined by the OpenGL ES specification. | 
|  | * | 
|  | * @param target | 
|  | * @param level | 
|  | * @param xoffset | 
|  | * @param yoffset | 
|  | * @param bitmap | 
|  | * @param type | 
|  | */ | 
|  | public static void texSubImage2D(int target, int level, int xoffset, int yoffset, | 
|  | Bitmap bitmap, int format, int type) { | 
|  | if (bitmap == null) { | 
|  | throw new NullPointerException("texSubImage2D can't be used with a null Bitmap"); | 
|  | } | 
|  | if (bitmap.isRecycled()) { | 
|  | throw new IllegalArgumentException("bitmap is recycled"); | 
|  | } | 
|  | if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, format, type) != 0) { | 
|  | throw new IllegalArgumentException("invalid Bitmap format"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Return a string for the EGL error code, or the hex representation | 
|  | * if the error is unknown. | 
|  | * | 
|  | * @param error The EGL error to convert into a String. | 
|  | * | 
|  | * @return An error string corresponding to the EGL error code. | 
|  | */ | 
|  | public static String getEGLErrorString(int error) { | 
|  | switch (error) { | 
|  | case EGL10.EGL_SUCCESS: | 
|  | return "EGL_SUCCESS"; | 
|  | case EGL10.EGL_NOT_INITIALIZED: | 
|  | return "EGL_NOT_INITIALIZED"; | 
|  | case EGL10.EGL_BAD_ACCESS: | 
|  | return "EGL_BAD_ACCESS"; | 
|  | case EGL10.EGL_BAD_ALLOC: | 
|  | return "EGL_BAD_ALLOC"; | 
|  | case EGL10.EGL_BAD_ATTRIBUTE: | 
|  | return "EGL_BAD_ATTRIBUTE"; | 
|  | case EGL10.EGL_BAD_CONFIG: | 
|  | return "EGL_BAD_CONFIG"; | 
|  | case EGL10.EGL_BAD_CONTEXT: | 
|  | return "EGL_BAD_CONTEXT"; | 
|  | case EGL10.EGL_BAD_CURRENT_SURFACE: | 
|  | return "EGL_BAD_CURRENT_SURFACE"; | 
|  | case EGL10.EGL_BAD_DISPLAY: | 
|  | return "EGL_BAD_DISPLAY"; | 
|  | case EGL10.EGL_BAD_MATCH: | 
|  | return "EGL_BAD_MATCH"; | 
|  | case EGL10.EGL_BAD_NATIVE_PIXMAP: | 
|  | return "EGL_BAD_NATIVE_PIXMAP"; | 
|  | case EGL10.EGL_BAD_NATIVE_WINDOW: | 
|  | return "EGL_BAD_NATIVE_WINDOW"; | 
|  | case EGL10.EGL_BAD_PARAMETER: | 
|  | return "EGL_BAD_PARAMETER"; | 
|  | case EGL10.EGL_BAD_SURFACE: | 
|  | return "EGL_BAD_SURFACE"; | 
|  | case EGL11.EGL_CONTEXT_LOST: | 
|  | return "EGL_CONTEXT_LOST"; | 
|  | default: | 
|  | return "0x" + Integer.toHexString(error); | 
|  | } | 
|  | } | 
|  |  | 
|  | private static native int native_getInternalFormat(Bitmap bitmap); | 
|  | private static native int native_getType(Bitmap bitmap); | 
|  | private static native int native_texImage2D(int target, int level, int internalformat, | 
|  | Bitmap bitmap, int type, int border); | 
|  | private static native int native_texSubImage2D(int target, int level, int xoffset, int yoffset, | 
|  | Bitmap bitmap, int format, int type); | 
|  | } |