blob: 028994414ea2d775195a91ffb61d34ff08b9875e [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* 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 com.google.gwt.typedarrays.client;
import com.google.gwt.core.client.JsArrayInteger;
import com.google.gwt.core.client.JsArrayNumber;
import com.google.gwt.typedarrays.shared.ArrayBuffer;
import com.google.gwt.typedarrays.shared.Float32Array;
import com.google.gwt.typedarrays.shared.Float64Array;
import com.google.gwt.typedarrays.shared.Int16Array;
import com.google.gwt.typedarrays.shared.Int32Array;
import com.google.gwt.typedarrays.shared.Int8Array;
import com.google.gwt.typedarrays.shared.Uint16Array;
import com.google.gwt.typedarrays.shared.Uint32Array;
import com.google.gwt.typedarrays.shared.Uint8Array;
import com.google.gwt.typedarrays.shared.Uint8ClampedArray;
/**
* JS-specific utility methods, for use in client-side code that has the values in
* JS objects already.
*/
public class JsUtils {
/**
* Creates an {@link ArrayBuffer} from a string, with bytes encoded as
* individual characters (which means in UTF8-encoded strings, byte
* values {@code 0x80-0xFF} take two bytes.
*
* @param str
* @return an {@link ArrayBuffer} containing the bytes decoded from the
* string
*/
public static native ArrayBuffer arrayBufferFromString(String str) /*-{
// TODO(jat): more efficient way to do this?
var len = str.length;
var buf = new Uint8Array(len);
for (var i = 0; i < len; ++i) {
buf[i] = str.charCodeAt(i);
}
return buf.buffer;
}-*/;
public static native Float32ArrayNative createFloat32Array(JsArrayNumber array) /*-{
return new Float32Array(array);
}-*/;
public static native Float64ArrayNative createFloat64Array(JsArrayNumber array) /*-{
return new Float64Array(array);
}-*/;
public static native Int16ArrayNative createInt16Array(JsArrayInteger array) /*-{
return new Int16Array(array);
}-*/;
public static native Int32ArrayNative createInt32Array(JsArrayInteger array) /*-{
return new Int32Array(array);
}-*/;
public static native Int8ArrayNative createInt8Array(JsArrayInteger array) /*-{
return new Int8Array(array);
}-*/;
public static native Uint16ArrayNative createUint16Array(JsArrayInteger array) /*-{
return new Uint16Array(array);
}-*/;
public static native Uint32ArrayNative createUint32Array(JsArrayNumber array) /*-{
return new Uint32Array(array);
}-*/;
public static native Uint8ArrayNative createUint8Array(JsArrayInteger array) /*-{
return new Uint8Array(array);
}-*/;
public static Uint8ClampedArray createUint8ClampedArray(JsArrayInteger array) {
if (hasClampedArray()) {
return Uint8ArrayNative.createClamped(array);
} else {
return Uint8ClampedArrayNativeEmul.create(array);
}
}
public static native void set(Float32Array dest, JsArrayNumber array) /*-{
dest.set(array);
}-*/;
public static native void set(Float32Array dest, JsArrayNumber array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Float64Array dest, JsArrayNumber array) /*-{
dest.set(array);
}-*/;
public static native void set(Float64Array dest, JsArrayNumber array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Int16Array dest, JsArrayInteger array) /*-{
dest.set(array);
}-*/;
public static native void set(Int16Array dest, JsArrayInteger array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Int32Array dest, JsArrayInteger array) /*-{
dest.set(array);
}-*/;
public static native void set(Int32Array dest, JsArrayInteger array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Int8Array dest, JsArrayInteger array) /*-{
dest.set(array);
}-*/;
public static native void set(Int8Array dest, JsArrayInteger array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Uint16Array dest, JsArrayInteger array) /*-{
dest.set(array);
}-*/;
public static native void set(Uint16Array dest, JsArrayInteger array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Uint32Array dest, JsArrayNumber array) /*-{
dest.set(array);
}-*/;
public static native void set(Uint32Array dest, JsArrayNumber array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static native void set(Uint8Array dest, JsArrayInteger array) /*-{
dest.set(array);
}-*/;
public static native void set(Uint8Array dest, JsArrayInteger array, int offset) /*-{
dest.set(array, offset);
}-*/;
public static void set(Uint8ClampedArray dest, JsArrayInteger array) {
if (hasClampedArray()) {
set((Uint8Array) dest, array, 0);
} else {
int len = array.length();
for (int i = 0; i < len; ++i) {
dest.set(i, array.get(i));
}
}
}
public static void set(Uint8ClampedArray dest, JsArrayInteger array, int offset) {
if (hasClampedArray()) {
set((Uint8Array) dest, array, offset);
} else {
int len = array.length();
for (int i = 0; i < len; ++i) {
dest.set(i + offset, array.get(i));
}
}
}
/**
* Creates a string from an {@link ArrayBuffer}, with bytes encoded as
* individual characters (which means in UTF8-encoded strings, byte
* values {@code 0x80-0xFF} take two bytes.
*
* @param buf
* @return a string encoding the bytes in the {@link ArrayBuffer}
*/
public static native String stringFromArrayBuffer(ArrayBuffer buf) /*-{
// TODO(jat): more efficient way to do this?
var cc = [];
var i8 = new Uint8Array(buf);
for (var i = 0; i < buf.byteLength; ++i) {
cc.push(i8[i]);
}
return String.fromCharCode.apply(null, cc);
}-*/;
private static native boolean hasClampedArray() /*-{
// TODO(jat): this is awkward - should this be deferred bound?
return !!(window.Uint8ClampedArray);
}-*/;
private JsUtils() {
}
}