159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.renderer.android;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.graphics.Bitmap;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.opengl.GLES20;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.opengl.GLUtils;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AndroidImageInfo;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image.Format;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer;
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.microedition.khronos.opengles.GL10;
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TextureUtil {
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static int convertTextureFormat(Format fmt){
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        switch (fmt){
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Alpha16:
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Alpha8:
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GL10.GL_ALPHA;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance8Alpha8:
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance16Alpha16:
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GL10.GL_LUMINANCE_ALPHA;
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance8:
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance16:
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GL10.GL_LUMINANCE;
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB10:
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB16:
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case BGR8:
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB8:
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB565:
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GL10.GL_RGB;
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB5A1:
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGBA16:
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGBA8:
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GL10.GL_RGBA;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth:
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GLES20.GL_DEPTH_COMPONENT;
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth16:
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return GLES20.GL_DEPTH_COMPONENT16;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth24:
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth32:
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth32F:
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new UnsupportedOperationException("Unsupported depth format: " + fmt);
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case DXT1A:
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new UnsupportedOperationException("Unsupported format: " + fmt);
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            default:
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new UnsupportedOperationException("Unrecognized format: " + fmt);
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private static void buildMipmap(Bitmap bitmap) {
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int level = 0;
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int height = bitmap.getHeight();
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int width = bitmap.getWidth();
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        while (height >= 1 || width >= 1) {
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            //First of all, generate the texture from our bitmap and set it to the according level
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (height == 1 || width == 1) {
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            //Increase the mipmap level
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            level++;
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            height /= 2;
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            width /= 2;
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, true);
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
73a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta            //bitmap.recycle();
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            bitmap = bitmap2;
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * <code>uploadTextureBitmap</code> uploads a native android bitmap
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param target
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param bitmap
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param generateMips
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param powerOf2
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static void uploadTextureBitmap(final int target, Bitmap bitmap, boolean generateMips, boolean powerOf2)
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    {
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (!powerOf2)
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        {
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int width = bitmap.getWidth();
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int height = bitmap.getHeight();
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height))
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            {
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                // scale to power of two
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                width = FastMath.nearestPowerOfTwo(width);
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                height = FastMath.nearestPowerOfTwo(height);
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, true);
97a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta                //bitmap.recycle();
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                bitmap = bitmap2;
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (generateMips)
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        {
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            buildMipmap(bitmap);
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        else
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        {
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            GLUtils.texImage2D(target, 0, bitmap, 0);
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            //bitmap.recycle();
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static void uploadTexture(
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     Image img,
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     int target,
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     int index,
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     int border,
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     boolean tdc,
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     boolean generateMips,
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                     boolean powerOf2){
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (img.getEfficentData() instanceof AndroidImageInfo){
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            // If image was loaded from asset manager, use fast path
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            AndroidImageInfo imageInfo = (AndroidImageInfo) img.getEfficentData();
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            uploadTextureBitmap(target, imageInfo.getBitmap(), generateMips, powerOf2);
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // Otherwise upload image directly.
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // Prefer to only use power of 2 textures here to avoid errors.
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Image.Format fmt = img.getFormat();
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ByteBuffer data;
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (index >= 0 || img.getData() != null && img.getData().size() > 0){
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            data = img.getData(index);
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }else{
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            data = null;
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int width = img.getWidth();
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int height = img.getHeight();
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int depth = img.getDepth();
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        boolean compress = false;
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int internalFormat = -1;
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int format = -1;
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int dataType = -1;
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        switch (fmt){
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Alpha16:
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Alpha8:
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_ALPHA;
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance8:
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_LUMINANCE;
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance8Alpha8:
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_LUMINANCE_ALPHA;
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance16Alpha16:
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_LUMINANCE_ALPHA;
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Luminance16:
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_LUMINANCE;
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB565:
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGB;
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                internalFormat = GLES20.GL_RGB565;
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_SHORT_5_6_5;
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case ARGB4444:
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGBA;
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_SHORT_4_4_4_4;
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB10:
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGB;
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB16:
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGB;
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB5A1:
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGBA;
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                internalFormat = GLES20.GL_RGB5_A1;
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_SHORT_5_5_5_1;
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGB8:
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGB;
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case BGR8:
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGB;
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGBA16:
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGBA;
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                internalFormat = GLES20.GL_RGBA4;
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case RGBA8:
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_RGBA;
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case DXT1A:
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_COMPRESSED_TEXTURE_FORMATS;
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth:
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_DEPTH_COMPONENT;
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth16:
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                format = GLES20.GL_DEPTH_COMPONENT;
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                internalFormat = GLES20.GL_DEPTH_COMPONENT16;
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                dataType = GLES20.GL_UNSIGNED_BYTE;
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth24:
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth32:
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case Depth32F:
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new UnsupportedOperationException("Unsupported depth format: " + fmt);
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            default:
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new UnsupportedOperationException("Unrecognized format: " + fmt);
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (internalFormat == -1)
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        {
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            internalFormat = format;
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (data != null)
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int[] mipSizes = img.getMipMapSizes();
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int pos = 0;
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mipSizes == null){
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (data != null)
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                mipSizes = new int[]{ data.capacity() };
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            else
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                mipSizes = new int[]{ width * height * fmt.getBitsPerPixel() / 8 };
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // XXX: might want to change that when support
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // of more than paletted compressions is added..
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (compress){
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            data.clear();
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D,
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      1 - mipSizes.length,
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      format,
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      width,
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      height,
25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      0,
25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      data.capacity(),
25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                      data);
25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int i = 0; i < mipSizes.length; i++){
26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int mipWidth =  Math.max(1, width  >> i);
26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int mipHeight = Math.max(1, height >> i);
26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int mipDepth =  Math.max(1, depth  >> i);
26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (data != null){
26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                data.position(pos);
26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                data.limit(pos + mipSizes[i]);
27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (compress && data != null){
27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D,
27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          i,
27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          format,
27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          mipWidth,
27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          mipHeight,
27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          0,
27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          data.remaining(),
28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                          data);
28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }else{
28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,
28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                i,
28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                internalFormat,
28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                mipWidth,
28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                mipHeight,
28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                0,
28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                format,
28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                dataType,
29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                data);
29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            pos += mipSizes[i];
29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
298