GLUtils.java revision 708c17b4168404042852e480f25a91a02cf14247
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.opengl; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.microedition.khronos.opengles.GL10; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Utility class to help bridging OpenGL ES and Android APIs. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class GLUtils { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We use a class initializer to allow the native code to cache some 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field offsets. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeClassInit(); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private GLUtils() { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return the internal format as defined by OpenGL ES of the supplied bitmap. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the internal format of the bitmap. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getInternalFormat(Bitmap bitmap) { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("getInternalFormat can't be used with a null Bitmap"); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50708c17b4168404042852e480f25a91a02cf14247Jack Palevich int result = native_getInternalFormat(bitmap); 51708c17b4168404042852e480f25a91a02cf14247Jack Palevich if (result < 0) { 52708c17b4168404042852e480f25a91a02cf14247Jack Palevich throw new IllegalArgumentException("Unknown internalformat"); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54708c17b4168404042852e480f25a91a02cf14247Jack Palevich return result; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 58708c17b4168404042852e480f25a91a02cf14247Jack Palevich * Return the type as defined by OpenGL ES of the supplied bitmap, if there 59708c17b4168404042852e480f25a91a02cf14247Jack Palevich * is one. If the bitmap is stored in a compressed format, it may not have 60708c17b4168404042852e480f25a91a02cf14247Jack Palevich * a valid OpenGL ES type. 61708c17b4168404042852e480f25a91a02cf14247Jack Palevich * @throws IllegalArgumentException if the bitmap does not have a type. 62708c17b4168404042852e480f25a91a02cf14247Jack Palevich * @param bitmap 63708c17b4168404042852e480f25a91a02cf14247Jack Palevich * @return the OpenGL ES type of the bitmap. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getType(Bitmap bitmap) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("getType can't be used with a null Bitmap"); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69708c17b4168404042852e480f25a91a02cf14247Jack Palevich int result = native_getType(bitmap); 70708c17b4168404042852e480f25a91a02cf14247Jack Palevich if (result < 0) { 71708c17b4168404042852e480f25a91a02cf14247Jack Palevich throw new IllegalArgumentException("Unknown type"); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73708c17b4168404042852e480f25a91a02cf14247Jack Palevich return result; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calls glTexImage2D() on the current OpenGL context. If no context is 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current the behavior is the same as calling glTexImage2D() with no 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current context, that is, eglGetError() will return the appropriate 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike glTexImage2D() bitmap cannot be null and will raise an exception 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in that case. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All other parameters are identical to those used for glTexImage2D(). 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sure to set it properly according to the supplied bitmap. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether or not bitmap can have non power of two dimensions depends on 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current OpenGL context. Always check glGetError() some time 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method, just like when using OpenGL directly. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param target 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param internalformat 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param border 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void texImage2D(int target, int level, int internalformat, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap, int border) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("texImage2D can't be used with a null Bitmap"); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 103708c17b4168404042852e480f25a91a02cf14247Jack Palevich if (native_texImage2D(target, level, internalformat, bitmap, -1, border)!=0) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("invalid Bitmap format"); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A version of texImage2D() that takes an explicit type parameter 110708c17b4168404042852e480f25a91a02cf14247Jack Palevich * as defined by the OpenGL ES specification. The actual type and 111708c17b4168404042852e480f25a91a02cf14247Jack Palevich * internalformat of the bitmap must be compatible with the specified 112708c17b4168404042852e480f25a91a02cf14247Jack Palevich * type and internalformat parameters. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param target 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param internalformat 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param border 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void texImage2D(int target, int level, int internalformat, 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap, int type, int border) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("texImage2D can't be used with a null Bitmap"); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (native_texImage2D(target, level, internalformat, bitmap, type, border)!=0) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("invalid Bitmap format"); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 132708c17b4168404042852e480f25a91a02cf14247Jack Palevich * A version of texImage2D that determines the internalFormat and type 133708c17b4168404042852e480f25a91a02cf14247Jack Palevich * automatically. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param target 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param border 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void texImage2D(int target, int level, Bitmap bitmap, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int border) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("texImage2D can't be used with a null Bitmap"); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145708c17b4168404042852e480f25a91a02cf14247Jack Palevich if (native_texImage2D(target, level, -1, bitmap, -1, border)!=0) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("invalid Bitmap format"); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calls glTexSubImage2D() on the current OpenGL context. If no context is 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current the behavior is the same as calling glTexSubImage2D() with no 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current context, that is, eglGetError() will return the appropriate 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike glTexSubImage2D() bitmap cannot be null and will raise an exception 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in that case. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All other parameters are identical to those used for glTexSubImage2D(). 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sure to set it properly according to the supplied bitmap. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether or not bitmap can have non power of two dimensions depends on 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current OpenGL context. Always check glGetError() some time 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method, just like when using OpenGL directly. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param target 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param xoffset 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param yoffset 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void texSubImage2D(int target, int level, int xoffset, int yoffset, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("texSubImage2D can't be used with a null Bitmap"); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type = getType(bitmap); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, -1, type)!=0) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("invalid Bitmap format"); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A version of texSubImage2D() that takes an explicit type parameter 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as defined by the OpenGL ES specification. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param target 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param xoffset 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param yoffset 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void texSubImage2D(int target, int level, int xoffset, int yoffset, 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap, int format, int type) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bitmap == null) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("texSubImage2D can't be used with a null Bitmap"); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, format, type)!=0) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("invalid Bitmap format"); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private static void nativeClassInit(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 206708c17b4168404042852e480f25a91a02cf14247Jack Palevich native private static int native_getInternalFormat(Bitmap bitmap); 207708c17b4168404042852e480f25a91a02cf14247Jack Palevich native private static int native_getType(Bitmap bitmap); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private static int native_texImage2D(int target, int level, int internalformat, 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap, int type, int border); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private static int native_texSubImage2D(int target, int level, int xoffset, int yoffset, 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap, int format, int type); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 213