/* * 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() { } }