diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index a1059e5..41044db 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -599,6 +599,44 @@
     }
 }
 
+static int getType(SkBitmap::Config config)
+{
+    switch(config) {
+        case SkBitmap::kA8_Config:
+            return GL_UNSIGNED_BYTE;
+        case SkBitmap::kARGB_4444_Config:
+            return GL_UNSIGNED_SHORT_4_4_4_4;
+        case SkBitmap::kARGB_8888_Config:
+            return GL_UNSIGNED_BYTE;
+        case SkBitmap::kIndex8_Config:
+            return -1; // No type for compressed data.
+        case SkBitmap::kRGB_565_Config:
+            return GL_UNSIGNED_SHORT_5_6_5;
+        default:
+            return -1;
+    }
+}
+
+static jint util_getInternalFormat(JNIEnv *env, jclass clazz,
+        jobject jbitmap)
+{
+    SkBitmap const * nativeBitmap =
+            (SkBitmap const *)env->GetIntField(jbitmap, nativeBitmapID);
+    const SkBitmap& bitmap(*nativeBitmap);
+    SkBitmap::Config config = bitmap.getConfig();
+    return getInternalFormat(config);
+}
+
+static jint util_getType(JNIEnv *env, jclass clazz,
+        jobject jbitmap)
+{
+    SkBitmap const * nativeBitmap =
+            (SkBitmap const *)env->GetIntField(jbitmap, nativeBitmapID);
+    const SkBitmap& bitmap(*nativeBitmap);
+    SkBitmap::Config config = bitmap.getConfig();
+    return getType(config);
+}
+
 static jint util_texImage2D(JNIEnv *env, jclass clazz,
         jint target, jint level, jint internalformat,
         jobject jbitmap, jint type, jint border)
@@ -610,6 +648,9 @@
     if (internalformat < 0) {
         internalformat = getInternalFormat(config);
     }
+    if (type < 0) {
+        type = getType(config);
+    }
     int err = checkFormat(config, internalformat, type);
     if (err)
         return err; 
@@ -694,6 +735,8 @@
 
 static JNINativeMethod gUtilsMethods[] = {
     {"nativeClassInit", "()V",                          (void*)nativeUtilsClassInit },
+    { "native_getInternalFormat", "(Landroid/graphics/Bitmap;)I", (void*) util_getInternalFormat }, 
+    { "native_getType", "(Landroid/graphics/Bitmap;)I", (void*) util_getType }, 
     { "native_texImage2D", "(IIILandroid/graphics/Bitmap;II)I", (void*)util_texImage2D }, 
     { "native_texSubImage2D", "(IIIILandroid/graphics/Bitmap;II)I", (void*)util_texSubImage2D }, 
 };
diff --git a/opengl/java/android/opengl/GLUtils.java b/opengl/java/android/opengl/GLUtils.java
index df6c557..e150c19 100644
--- a/opengl/java/android/opengl/GLUtils.java
+++ b/opengl/java/android/opengl/GLUtils.java
@@ -40,7 +40,6 @@
 
     /**
      * return the internal format as defined by OpenGL ES of the supplied bitmap.
-     *
      * @param bitmap
      * @return the internal format of the bitmap.
      */
@@ -48,40 +47,30 @@
         if (bitmap == null) {
             throw new NullPointerException("getInternalFormat can't be used with a null Bitmap");
         }
-        switch (bitmap.getConfig()) {
-            case ALPHA_8:
-                return GL10.GL_ALPHA;
-            case ARGB_4444:
-            case ARGB_8888:
-                return GL10.GL_RGBA;
-            case RGB_565:
-                return GL10.GL_RGB;
+        int result = native_getInternalFormat(bitmap);
+        if (result < 0) {
+            throw new IllegalArgumentException("Unknown internalformat");
         }
-        throw new IllegalArgumentException("Unknown internalformat");
+        return result;
     }
 
     /**
-     * Return the type as defined by OpenGL ES of the supplied bitmap.
+     * 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");
         }
-        int type;
-        switch(bitmap.getConfig()) {
-            case ARGB_4444:
-                type = GL10.GL_UNSIGNED_SHORT_4_4_4_4;
-                break;
-            case RGB_565:
-                type = GL10.GL_UNSIGNED_SHORT_5_6_5;
-                break;
-            case ALPHA_8:
-            case ARGB_8888:
-            default:
-                type = GL10.GL_UNSIGNED_BYTE;
-                break;
+        int result = native_getType(bitmap);
+        if (result < 0) {
+            throw new IllegalArgumentException("Unknown type");
         }
-        return type;
+        return result;
     }
 
     /**
@@ -111,15 +100,16 @@
         if (bitmap == null) {
             throw new NullPointerException("texImage2D can't be used with a null Bitmap");
         }
-        int type = getType(bitmap);
-        if (native_texImage2D(target, level, internalformat, bitmap, type, border)!=0) {
+        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.
+     * 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
@@ -139,7 +129,8 @@
     }
 
     /**
-     * A version of texImage2D that determines the internalFormat automatically.
+     * A version of texImage2D that determines the internalFormat and type
+     * automatically.
      *
      * @param target
      * @param level
@@ -151,8 +142,7 @@
         if (bitmap == null) {
             throw new NullPointerException("texImage2D can't be used with a null Bitmap");
         }
-        int type = getType(bitmap);
-        if (native_texImage2D(target, level, -1, bitmap, type, border)!=0) {
+        if (native_texImage2D(target, level, -1, bitmap, -1, border)!=0) {
             throw new IllegalArgumentException("invalid Bitmap format");
         }
     }
@@ -213,6 +203,8 @@
 
     native private static void nativeClassInit();
 
+    native private static int native_getInternalFormat(Bitmap bitmap);
+    native private static int native_getType(Bitmap bitmap);
     native private static int native_texImage2D(int target, int level, int internalformat,
             Bitmap bitmap, int type, int border);
     native private static int native_texSubImage2D(int target, int level, int xoffset, int yoffset,
