aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/gluegen/runtime/BufferFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/jogamp/gluegen/runtime/BufferFactory.java')
-rwxr-xr-xsrc/java/com/jogamp/gluegen/runtime/BufferFactory.java473
1 files changed, 245 insertions, 228 deletions
diff --git a/src/java/com/jogamp/gluegen/runtime/BufferFactory.java b/src/java/com/jogamp/gluegen/runtime/BufferFactory.java
index 24d842c..1f8182c 100755
--- a/src/java/com/jogamp/gluegen/runtime/BufferFactory.java
+++ b/src/java/com/jogamp/gluegen/runtime/BufferFactory.java
@@ -36,282 +36,299 @@
* Sun gratefully acknowledges that this software was originally authored
* and developed by Kenneth Bradley Russell and Christopher John Kline.
*/
-
package com.jogamp.gluegen.runtime;
import java.nio.*;
+/**
+ * @author Kenneth Russel
+ * @author Sven Gothel
+ * @author Michael Bien
+ */
public class BufferFactory {
- public static final int SIZEOF_BYTE = 1;
- public static final int SIZEOF_SHORT = 2;
- public static final int SIZEOF_CHAR = 2;
- public static final int SIZEOF_INT = 4;
- public static final int SIZEOF_FLOAT = 4;
- public static final int SIZEOF_LONG = 8;
- public static final int SIZEOF_DOUBLE = 8;
-
- private static final boolean isLittleEndian;
-
- static {
- ByteBuffer tst_b = BufferFactory.newDirectByteBuffer(BufferFactory.SIZEOF_INT); // 32bit in native order
- IntBuffer tst_i = tst_b.asIntBuffer();
- ShortBuffer tst_s = tst_b.asShortBuffer();
- tst_i.put(0, 0x0A0B0C0D);
- isLittleEndian = 0x0C0D == tst_s.get(0) ;
- }
- public static boolean isLittleEndian() {
- return isLittleEndian;
- }
+ public static final int SIZEOF_BYTE = 1;
+ public static final int SIZEOF_SHORT = 2;
+ public static final int SIZEOF_CHAR = 2;
+ public static final int SIZEOF_INT = 4;
+ public static final int SIZEOF_FLOAT = 4;
+ public static final int SIZEOF_LONG = 8;
+ public static final int SIZEOF_DOUBLE = 8;
- /** Helper routine to create a direct ByteBuffer with native order */
- public static ByteBuffer newDirectByteBuffer(int size) {
- return nativeOrder(ByteBuffer.allocateDirect(size));
- }
-
- /** Helper routine to set a ByteBuffer to the native byte order, if
- that operation is supported by the underlying NIO
- implementation. */
- public static ByteBuffer nativeOrder(ByteBuffer buf) {
- return buf.order(ByteOrder.nativeOrder());
- }
-
- /** Helper routine to tell whether a buffer is direct or not. Null
- pointers are considered NOT direct. isDirect() should really be
- public in Buffer and not replicated in all subclasses. */
- public static boolean isDirect(Object buf) {
- if (buf == null) {
- return true;
- }
- if (buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).isDirect();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).isDirect();
- } else if (buf instanceof DoubleBuffer) {
- return ((DoubleBuffer) buf).isDirect();
- } else if (buf instanceof CharBuffer) {
- return ((CharBuffer) buf).isDirect();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).isDirect();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).isDirect();
- } else if (buf instanceof LongBuffer) {
- return ((LongBuffer) buf).isDirect();
- } else if (buf instanceof PointerBuffer) {
- return ((PointerBuffer) buf).isDirect();
+ public static boolean isLittleEndian() {
+ return Platform.isLittleEndian();
}
- throw new RuntimeException("Unexpected buffer type " + buf.getClass().getName());
- }
+ /**
+ * Helper routine to create a direct ByteBuffer with native order
+ */
+ public static ByteBuffer newDirectByteBuffer(int size) {
+ return nativeOrder(ByteBuffer.allocateDirect(size));
+ }
- /** Helper routine to get the Buffer byte offset by taking into
- account the Buffer position and the underlying type. This is
- the total offset for Direct Buffers. */
-
- public static int getDirectBufferByteOffset(Object buf) {
- if(buf == null) {
- return 0;
+ /**
+ * Helper routine to set a ByteBuffer to the native byte order, if
+ * that operation is supported by the underlying NIO
+ * implementation.
+ */
+ public static ByteBuffer nativeOrder(ByteBuffer buf) {
+ if (Platform.isJavaSE()) {
+ return buf.order(ByteOrder.nativeOrder());
+ } else {
+ // JSR 239 does not support the ByteOrder class or the order methods.
+ // The initial order of a byte buffer is the platform byte order.
+ return buf;
+ }
}
- if(buf instanceof Buffer) {
- int pos = ((Buffer)buf).position();
- if(buf instanceof ByteBuffer) {
- return pos;
+
+ /**
+ * Helper routine to tell whether a buffer is direct or not. Null
+ * pointers are considered NOT direct. isDirect() should really be
+ * public in Buffer and not replicated in all subclasses.
+ */
+ public static boolean isDirect(Object buf) {
+ if (buf == null) {
+ return true;
+ }
+ if (buf instanceof ByteBuffer) {
+ return ((ByteBuffer) buf).isDirect();
} else if (buf instanceof FloatBuffer) {
- return pos * SIZEOF_FLOAT;
+ return ((FloatBuffer) buf).isDirect();
} else if (buf instanceof IntBuffer) {
- return pos * SIZEOF_INT;
+ return ((IntBuffer) buf).isDirect();
} else if (buf instanceof ShortBuffer) {
- return pos * SIZEOF_SHORT;
- } else if (buf instanceof DoubleBuffer) {
- return pos * SIZEOF_DOUBLE;
- } else if (buf instanceof LongBuffer) {
- return pos * SIZEOF_LONG;
- } else if (buf instanceof CharBuffer) {
- return pos * SIZEOF_CHAR;
+ return ((ShortBuffer) buf).isDirect();
+ } else if (buf instanceof PointerBuffer) {
+ return ((PointerBuffer) buf).isDirect();
+ } else if (Platform.isJavaSE()) {
+ if (buf instanceof DoubleBuffer) {
+ return ((DoubleBuffer) buf).isDirect();
+ } else if (buf instanceof LongBuffer) {
+ return ((LongBuffer) buf).isDirect();
+ }else if (buf instanceof CharBuffer) {
+ return ((CharBuffer) buf).isDirect();
+ }
}
- } else if (buf instanceof PointerBuffer) {
- PointerBuffer pb = (PointerBuffer)buf;
- return pb.position() * pb.elementSize();
- }
+ throw new RuntimeException("Unexpected buffer type " + buf.getClass().getName());
+ }
- throw new RuntimeException("Disallowed array backing store type in buffer "
- + buf.getClass().getName());
- }
+ /**
+ * Helper routine to get the Buffer byte offset by taking into
+ * account the Buffer position and the underlying type. This is
+ * the total offset for Direct Buffers.
+ */
+ public static int getDirectBufferByteOffset(Object buf) {
+ if (buf == null) {
+ return 0;
+ }
+ if (buf instanceof Buffer) {
+ int pos = ((Buffer) buf).position();
+ if (buf instanceof ByteBuffer) {
+ return pos;
+ } else if (buf instanceof FloatBuffer) {
+ return pos * SIZEOF_FLOAT;
+ } else if (buf instanceof IntBuffer) {
+ return pos * SIZEOF_INT;
+ } else if (buf instanceof ShortBuffer) {
+ return pos * SIZEOF_SHORT;
+ }else if(Platform.isJavaSE()) {
+ if (buf instanceof DoubleBuffer) {
+ return pos * SIZEOF_DOUBLE;
+ } else if (buf instanceof LongBuffer) {
+ return pos * SIZEOF_LONG;
+ } else if (buf instanceof CharBuffer) {
+ return pos * SIZEOF_CHAR;
+ }
+ }
+ } else if (buf instanceof PointerBuffer) {
+ PointerBuffer pointerBuffer = (PointerBuffer) buf;
+ return pointerBuffer.position() * PointerBuffer.elementSize();
+ }
+ throw new RuntimeException("Disallowed array backing store type in buffer "
+ + buf.getClass().getName());
+ }
- /** Helper routine to return the array backing store reference from
- a Buffer object. */
+ /**
+ * Helper routine to return the array backing store reference from
+ * a Buffer object.
+ */
+ public static Object getArray(Object buf) {
+ if (buf == null) {
+ return null;
+ }
+ if (buf instanceof ByteBuffer) {
+ return ((ByteBuffer) buf).array();
+ } else if (buf instanceof FloatBuffer) {
+ return ((FloatBuffer) buf).array();
+ } else if (buf instanceof IntBuffer) {
+ return ((IntBuffer) buf).array();
+ } else if (buf instanceof ShortBuffer) {
+ return ((ShortBuffer) buf).array();
+ } else if (buf instanceof PointerBuffer) {
+ return ((PointerBuffer) buf).array();
+ }else if(Platform.isJavaSE()) {
+ if (buf instanceof DoubleBuffer) {
+ return ((DoubleBuffer) buf).array();
+ } else if (buf instanceof LongBuffer) {
+ return ((LongBuffer) buf).array();
+ } else if (buf instanceof CharBuffer) {
+ return ((CharBuffer) buf).array();
+ }
+ }
- public static Object getArray(Object buf) {
- if (buf == null) {
- return null;
- }
- if(buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).array();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).array();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).array();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).array();
- } else if (buf instanceof DoubleBuffer) {
- return ((DoubleBuffer) buf).array();
- } else if (buf instanceof LongBuffer) {
- return ((LongBuffer) buf).array();
- } else if (buf instanceof CharBuffer) {
- return ((CharBuffer) buf).array();
- } else if (buf instanceof PointerBuffer) {
- return ((PointerBuffer) buf).array();
- }
+ throw new RuntimeException("Disallowed array backing store type in buffer "
+ + buf.getClass().getName());
+ }
- throw new RuntimeException("Disallowed array backing store type in buffer "
- + buf.getClass().getName());
- }
+ /**
+ * Helper routine to get the full byte offset from the beginning of
+ * the array that is the storage for the indirect Buffer
+ * object. The array offset also includes the position offset
+ * within the buffer, in addition to any array offset.
+ */
+ public static int getIndirectBufferByteOffset(Object buf) {
+ if (buf == null) {
+ return 0;
+ }
+ if (buf instanceof Buffer) {
+ int pos = ((Buffer) buf).position();
+ if (buf instanceof ByteBuffer) {
+ return (((ByteBuffer) buf).arrayOffset() + pos);
+ } else if (buf instanceof FloatBuffer) {
+ return (SIZEOF_FLOAT * (((FloatBuffer) buf).arrayOffset() + pos));
+ } else if (buf instanceof IntBuffer) {
+ return (SIZEOF_INT * (((IntBuffer) buf).arrayOffset() + pos));
+ } else if (buf instanceof ShortBuffer) {
+ return (SIZEOF_SHORT * (((ShortBuffer) buf).arrayOffset() + pos));
+ }else if(Platform.isJavaSE()) {
+ if (buf instanceof DoubleBuffer) {
+ return (SIZEOF_DOUBLE * (((DoubleBuffer) buf).arrayOffset() + pos));
+ } else if (buf instanceof LongBuffer) {
+ return (SIZEOF_LONG * (((LongBuffer) buf).arrayOffset() + pos));
+ } else if (buf instanceof CharBuffer) {
+ return (SIZEOF_CHAR * (((CharBuffer) buf).arrayOffset() + pos));
+ }
+ }
+ } else if (buf instanceof PointerBuffer) {
+ PointerBuffer pointerBuffer = (PointerBuffer) buf;
+ return PointerBuffer.elementSize() * (pointerBuffer.arrayOffset() + pointerBuffer.position());
+ }
+ throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
+ }
- /** Helper routine to get the full byte offset from the beginning of
- the array that is the storage for the indirect Buffer
- object. The array offset also includes the position offset
- within the buffer, in addition to any array offset. */
+ public static void rangeCheck(byte[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- public static int getIndirectBufferByteOffset(Object buf) {
- if(buf == null) {
- return 0;
- }
- if (buf instanceof Buffer) {
- int pos = ((Buffer)buf).position();
- if(buf instanceof ByteBuffer) {
- return (((ByteBuffer)buf).arrayOffset() + pos);
- } else if(buf instanceof FloatBuffer) {
- return (SIZEOF_FLOAT*(((FloatBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof IntBuffer) {
- return (SIZEOF_INT*(((IntBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof ShortBuffer) {
- return (SIZEOF_SHORT*(((ShortBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof DoubleBuffer) {
- return (SIZEOF_DOUBLE*(((DoubleBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof LongBuffer) {
- return (SIZEOF_LONG*(((LongBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof CharBuffer) {
- return (SIZEOF_CHAR*(((CharBuffer)buf).arrayOffset() + pos));
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
}
- } else if(buf instanceof PointerBuffer) {
- PointerBuffer pb = (PointerBuffer)buf;
- return pb.elementSize()*(pb.arrayOffset() + pb.position());
}
- throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
- }
-
- public static void rangeCheck(byte[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
+ public static void rangeCheck(char[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ }
}
- }
- public static void rangeCheck(char[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
+ public static void rangeCheck(short[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ }
}
- }
- public static void rangeCheck(short[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
+ public static void rangeCheck(int[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ }
}
- }
- public static void rangeCheck(int[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
+ public static void rangeCheck(long[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ }
}
- }
- public static void rangeCheck(long[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
+ public static void rangeCheck(float[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- public static void rangeCheck(float[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ }
}
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
+ public static void rangeCheck(double[] array, int offset, int minElementsRemaining) {
+ if (array == null) {
+ return;
+ }
- public static void rangeCheck(double[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ if (array.length < offset + minElementsRemaining) {
+ throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
+ }
}
- }
- public static void rangeCheck(Buffer buffer, int minElementsRemaining) {
- if (buffer == null) {
- return;
- }
+ public static void rangeCheck(Buffer buffer, int minElementsRemaining) {
+ if (buffer == null) {
+ return;
+ }
- if (buffer.remaining() < minElementsRemaining) {
- throw new IndexOutOfBoundsException("Required " + minElementsRemaining + " remaining elements in buffer, only had " + buffer.remaining());
+ if (buffer.remaining() < minElementsRemaining) {
+ throw new IndexOutOfBoundsException("Required " + minElementsRemaining + " remaining elements in buffer, only had " + buffer.remaining());
+ }
}
- }
- public static void rangeCheckBytes(Object buffer, int minBytesRemaining) {
- if (buffer == null) {
- return;
- }
+ public static void rangeCheckBytes(Object buffer, int minBytesRemaining) {
+ if (buffer == null) {
+ return;
+ }
- int bytesRemaining = 0;
- if (buffer instanceof Buffer) {
- int elementsRemaining = ((Buffer)buffer).remaining();
- if (buffer instanceof ByteBuffer) {
- bytesRemaining = elementsRemaining;
- } else if (buffer instanceof FloatBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_FLOAT;
- } else if (buffer instanceof IntBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_INT;
- } else if (buffer instanceof ShortBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_SHORT;
- } else if (buffer instanceof DoubleBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_DOUBLE;
- } else if (buffer instanceof LongBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_LONG;
- } else if (buffer instanceof CharBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_CHAR;
+ int bytesRemaining = 0;
+ if (buffer instanceof Buffer) {
+ int elementsRemaining = ((Buffer) buffer).remaining();
+ if (buffer instanceof ByteBuffer) {
+ bytesRemaining = elementsRemaining;
+ } else if (buffer instanceof FloatBuffer) {
+ bytesRemaining = elementsRemaining * SIZEOF_FLOAT;
+ } else if (buffer instanceof IntBuffer) {
+ bytesRemaining = elementsRemaining * SIZEOF_INT;
+ } else if (buffer instanceof ShortBuffer) {
+ bytesRemaining = elementsRemaining * SIZEOF_SHORT;
+ }else if(Platform.isJavaSE()) {
+ if (buffer instanceof DoubleBuffer) {
+ bytesRemaining = elementsRemaining * SIZEOF_DOUBLE;
+ } else if (buffer instanceof LongBuffer) {
+ bytesRemaining = elementsRemaining * SIZEOF_LONG;
+ } else if (buffer instanceof CharBuffer) {
+ bytesRemaining = elementsRemaining * SIZEOF_CHAR;
+ }
+ }
+ } else if (buffer instanceof PointerBuffer) {
+ PointerBuffer pointerBuffer = (PointerBuffer) buffer;
+ bytesRemaining = pointerBuffer.remaining() * PointerBuffer.elementSize();
+ }
+ if (bytesRemaining < minBytesRemaining) {
+ throw new IndexOutOfBoundsException("Required " + minBytesRemaining + " remaining bytes in buffer, only had " + bytesRemaining);
}
- } else if (buffer instanceof PointerBuffer) {
- PointerBuffer pb = (PointerBuffer)buffer;
- bytesRemaining = pb.remaining() * pb.elementSize();
- }
- if (bytesRemaining < minBytesRemaining) {
- throw new IndexOutOfBoundsException("Required " + minBytesRemaining + " remaining bytes in buffer, only had " + bytesRemaining);
}
- }
}