@Override public void glTexSubImage2D (int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, Buffer pixels) { if (pixels.limit() > 1) { HasArrayBufferView arrayHolder = (HasArrayBufferView) pixels; ArrayBufferView webGLArray = arrayHolder.getTypedArray(); ArrayBufferView buffer; if (pixels instanceof FloatBuffer) { buffer = webGLArray; } else { int remainingBytes = pixels.remaining() * 4; int byteOffset = webGLArray.byteOffset() + pixels.position() * 4; buffer = Uint8ArrayNative.create(webGLArray.buffer(), byteOffset, remainingBytes); } gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } else { Pixmap pixmap = Pixmap.pixmaps.get(((IntBuffer) pixels).get(0)); gl.texSubImage2D(target, level, xoffset, yoffset, format, type, pixmap.getCanvasElement()); } }
/** * Copy bytes from the underlying buffer to a temporary buffer, reversing them * in the process. * * @param src * @param srcOfs offset into {@code buffer} * @param len number of bytes to copy * @param dest * @param destOfs */ protected final void reverseBytes(Uint8ArrayNative src, int srcOfs, int len, Uint8ArrayNative dest, int destOfs) { for (int i = 0; i < len; ++i) { dest.set(i + destOfs, src.get(srcOfs + len - 1 - i)); } } }
@Override public float getFloat32(int byteOffset, boolean littleEndian) { ArrayBuffer buf = buffer; int ofs = bufferByteOffset + byteOffset; int len = Float32Array.BYTES_PER_ELEMENT; if (littleEndian != nativeLittleEndian) { reverseBytes(uint8Array, ofs, len, tempBuffer, 0); buf = tempBuffer.buffer(); ofs = 0; } return Float32ArrayNative.create(buf, ofs, 1).get(0); }
@Override public void set(Uint8Array array) { set(array, 0); }
/** * Create a {@link Uint8Array} instance from an array. Must only be called if * the environment natively supports clamped arrays -- otherwise * {@link Uint8ClampedArrayNativeEmul} should be used instead. * * @param array an array of initial values * @return a {@link Uint8Array} instance */ public static Uint8ArrayNative createClamped(short[] array) { return createClamped(JsArrayUtils.readOnlyJsArray(array)); }
@Override public void set(Uint8Array array, int offset) { if (array instanceof Uint8ArrayNative) { // Note that any JSO would pass this check, but since only one JSO can // implement a given interface it has to be this one, so any other // implementations must be Java emulations. setNative(array, offset); return; } int len = array.length(); for (int i = 0; i < len; ++i) { set(offset++, array.get(i)); } }
@Override final void putImmutably(Buff source) { GWTBuff buff = (GWTBuff) source; int length = buff.remaining(); if (length > remaining()) throw new RuntimeException(); if (_useTypedArrays) _typed.set(buff._typed.subarray(buff._position, buff._position + length), _position); else System.arraycopy(buff._array, buff._position, _array, _position, length); _position += length; }
@Override public byte getByte() { if (Debug.ENABLED) Debug.assertion(_position < _limit); if (_useTypedArrays) return (byte) _typed.get(_position++); return _array[_position++]; }
@Override public int getInt32(int byteOffset, boolean littleEndian) { ArrayBuffer buf = buffer; int ofs = bufferByteOffset + byteOffset; int len = Int32Array.BYTES_PER_ELEMENT; if (littleEndian != nativeLittleEndian) { reverseBytes(uint8Array, ofs, len, tempBuffer, 0); buf = tempBuffer.buffer(); ofs = 0; } return Int32ArrayNative.create(buf, ofs, 1).get(0); }
@Override public void set(int[] array) { set(array, 0); }
/** * Create a {@link Uint8Array} instance from an array. Must only be called if * the environment natively supports clamped arrays -- otherwise * {@link Uint8ClampedArrayNativeEmul} should be used instead. * * @param array an array of initial values * @return a {@link Uint8Array} instance */ public static Uint8ArrayNative createClamped(int[] array) { return createClamped(JsArrayUtils.readOnlyJsArray(array)); }
/** * Copy bytes from the underlying buffer to a temporary buffer, reversing them * in the process. * * @param src * @param srcOfs offset into {@code buffer} * @param len number of bytes to copy * @param dest * @param destOfs */ protected final void reverseBytes(Uint8ArrayNative src, int srcOfs, int len, Uint8ArrayNative dest, int destOfs) { for (int i = 0; i < len; ++i) { dest.set(i + destOfs, src.get(srcOfs + len - 1 - i)); } } }
@Override public void set(Uint8Array array, int offset) { if (array instanceof Uint8ArrayNative) { // Note that any JSO would pass this check, but since only one JSO can // implement a given interface it has to be this one, so any other // implementations must be Java emulations. setNative(array, offset); return; } int len = array.length(); for (int i = 0; i < len; ++i) { set(offset++, array.get(i)); } }
@Override public void getImmutably(byte[] bytes, int offset, int length) { if (length > remaining()) throw new RuntimeException(); if (_useTypedArrays) { for (int i = 0; i < length; i++) bytes[offset + i] = (byte) _typed.get(_position + i); } else System.arraycopy(_array, _position, bytes, offset, length); }
@Override public void glTexSubImage2D (int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, Buffer pixels) { if (pixels.limit() > 1) { HasArrayBufferView arrayHolder = (HasArrayBufferView) pixels; ArrayBufferView webGLArray = arrayHolder.getTypedArray(); ArrayBufferView buffer; if (pixels instanceof FloatBuffer) { buffer = webGLArray; } else { int remainingBytes = pixels.remaining() * 4; int byteOffset = webGLArray.byteOffset() + pixels.position() * 4; buffer = Uint8ArrayNative.create(webGLArray.buffer(), byteOffset, remainingBytes); } gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } else { Pixmap pixmap = Pixmap.pixmaps.get(((IntBuffer) pixels).get(0)); gl.texSubImage2D(target, level, xoffset, yoffset, format, type, pixmap.getCanvasElement()); } }
@Override public long getUint32(int byteOffset, boolean littleEndian) { ArrayBuffer buf = buffer; int ofs = bufferByteOffset + byteOffset; int len = Uint32Array.BYTES_PER_ELEMENT; if (littleEndian != nativeLittleEndian) { reverseBytes(uint8Array, ofs, len, tempBuffer, 0); buf = tempBuffer.buffer(); ofs = 0; } return Uint32ArrayNative.create(buf, ofs, 1).get(0); }