136 lines
3.9 KiB
Java
136 lines
3.9 KiB
Java
/*
|
|
* 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 java.io.InputStream;
|
|
import java.io.IOException;
|
|
import java.nio.Buffer;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import javax.microedition.khronos.opengles.GL10;
|
|
|
|
import android.content.res.AssetManager;
|
|
|
|
/**
|
|
* {@hide}
|
|
*/
|
|
public class Texture {
|
|
|
|
private int width, height, bpp;
|
|
private ByteBuffer data;
|
|
private int name = -1;
|
|
|
|
// Texture maps have the following format. All integers
|
|
// are 16 bits, high byte first. Pixels are in 5/6/5
|
|
// RGB format, low byte first.
|
|
//
|
|
// width
|
|
// height
|
|
// pixel (0, 0)
|
|
// pixel (1, 0)
|
|
// ...
|
|
// pixel (width - 1, height - 1)
|
|
|
|
private int readInt16(InputStream is) throws IOException {
|
|
return is.read() | (is.read() << 8);
|
|
}
|
|
|
|
public Texture(InputStream is) throws IOException {
|
|
this.width = readInt16(is);
|
|
this.height = readInt16(is);
|
|
this.bpp = 2;
|
|
|
|
int npixels = width*height;
|
|
int nbytes = npixels*bpp;
|
|
byte[] arr = new byte[nbytes];
|
|
|
|
int idx = 0;
|
|
while (idx < nbytes) {
|
|
int nread = is.read(arr, idx, nbytes - idx);
|
|
idx += nread;
|
|
}
|
|
|
|
if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
|
|
// Swap pairs of bytes on big-endian platforms
|
|
for (int i = 0; i < npixels; i++) {
|
|
int j = i*2;
|
|
int k = j + 1;
|
|
|
|
byte tmp = arr[j];
|
|
arr[j] = arr[k];
|
|
arr[k] = tmp;
|
|
}
|
|
}
|
|
|
|
this.data = ByteBuffer.allocateDirect(arr.length);
|
|
this.data.order(ByteOrder.nativeOrder());
|
|
data.put(arr);
|
|
data.position(0);
|
|
}
|
|
|
|
private int loadTexture(GL10 gl,
|
|
int textureUnit,
|
|
int minFilter, int magFilter,
|
|
int wrapS, int wrapT,
|
|
int mode,
|
|
int width, int height,
|
|
int dataType,
|
|
Buffer data) {
|
|
int[] texture = new int[1];
|
|
gl.glGenTextures(1, texture, 0);
|
|
|
|
gl.glEnable(gl.GL_TEXTURE_2D);
|
|
gl.glClientActiveTexture(textureUnit);
|
|
gl.glBindTexture(gl.GL_TEXTURE_2D, texture[0]);
|
|
gl.glTexParameterf(gl.GL_TEXTURE_2D,
|
|
gl.GL_TEXTURE_MIN_FILTER,
|
|
minFilter);
|
|
gl.glTexParameterf(gl.GL_TEXTURE_2D,
|
|
gl.GL_TEXTURE_MAG_FILTER,
|
|
magFilter);
|
|
gl.glTexParameterf(gl.GL_TEXTURE_2D,
|
|
gl.GL_TEXTURE_WRAP_S,
|
|
wrapS);
|
|
gl.glTexParameterf(gl.GL_TEXTURE_2D,
|
|
gl.GL_TEXTURE_WRAP_T,
|
|
wrapT);
|
|
gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, mode);
|
|
|
|
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB,
|
|
width, height,
|
|
0, gl.GL_RGB, dataType,
|
|
data);
|
|
|
|
return texture[0];
|
|
}
|
|
|
|
public void setTextureParameters(GL10 gl) {
|
|
if (name < 0) {
|
|
name = loadTexture(gl,
|
|
gl.GL_TEXTURE0,
|
|
gl.GL_NEAREST, gl.GL_NEAREST,
|
|
gl.GL_REPEAT, gl.GL_REPEAT,
|
|
gl.GL_MODULATE,
|
|
width, height,
|
|
gl.GL_UNSIGNED_SHORT_5_6_5,
|
|
data);
|
|
}
|
|
|
|
gl.glBindTexture(gl.GL_TEXTURE_2D, name);
|
|
}
|
|
}
|