package com.glview.utils; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.CharBuffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.LongBuffer; import java.nio.ShortBuffer; import com.glview.Lib; public class BufferUtils { static { Lib.init(); } public static FloatBuffer newFloatBuffer (int numFloats) { ByteBuffer buffer = ByteBuffer.allocateDirect(numFloats * 4); buffer.order(ByteOrder.nativeOrder()); return buffer.asFloatBuffer(); } public static DoubleBuffer newDoubleBuffer (int numDoubles) { ByteBuffer buffer = ByteBuffer.allocateDirect(numDoubles * 8); buffer.order(ByteOrder.nativeOrder()); return buffer.asDoubleBuffer(); } public static ByteBuffer newByteBuffer (int numBytes) { ByteBuffer buffer = ByteBuffer.allocateDirect(numBytes); buffer.order(ByteOrder.nativeOrder()); return buffer; } public static ShortBuffer newShortBuffer (int numShorts) { ByteBuffer buffer = ByteBuffer.allocateDirect(numShorts * 2); buffer.order(ByteOrder.nativeOrder()); return buffer.asShortBuffer(); } public static CharBuffer newCharBuffer (int numChars) { ByteBuffer buffer = ByteBuffer.allocateDirect(numChars * 2); buffer.order(ByteOrder.nativeOrder()); return buffer.asCharBuffer(); } public static IntBuffer newIntBuffer (int numInts) { ByteBuffer buffer = ByteBuffer.allocateDirect(numInts * 4); buffer.order(ByteOrder.nativeOrder()); return buffer.asIntBuffer(); } public static LongBuffer newLongBuffer (int numLongs) { ByteBuffer buffer = ByteBuffer.allocateDirect(numLongs * 8); buffer.order(ByteOrder.nativeOrder()); return buffer.asLongBuffer(); } public static void copy (float[] src, Buffer dst, int numFloats, int offset) { if (dst instanceof ByteBuffer) dst.limit(numFloats << 2); else if (dst instanceof FloatBuffer) dst.limit(numFloats); copyJni(src, dst, numFloats, offset); dst.position(0); } public static void copy(ByteBuffer src, int srcOffset, ByteBuffer dst, int dstOffset, int numBytes) { copyJni(src, srcOffset, dst, dstOffset, numBytes); } /** Writes the specified number of zeros to the buffer. This is generally faster than reallocating a new buffer. */ public static native void clear (ByteBuffer buffer, int numBytes); /* memset(buffer, 0, numBytes); */ private native static void copyJni (float[] src, Buffer dst, int numFloats, int offset); /* memcpy(dst, src + offset, numFloats << 2 ); */ private native static void copyJni (byte[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (char[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (short[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (int[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (long[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (float[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (double[] src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ private native static void copyJni (Buffer src, int srcOffset, Buffer dst, int dstOffset, int numBytes); /* memcpy(dst + dstOffset, src + srcOffset, numBytes); */ }