/* * 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.typedarrays.shared.ArrayBuffer; import com.google.gwt.typedarrays.shared.Uint8Array; import com.google.gwt.typedarrays.shared.Uint8ClampedArray; /** * Emulated version of {@link Uint8ClampedArray} that is implemented using a {@link Uint8Array}. */ public class Uint8ClampedArrayNativeEmul implements Uint8ClampedArray { /** * Create a {@link Uint8ClampedArray} instance on an existing * {@link ArrayBuffer}. * * @param buffer * @param byteOffset * @param length * @return {@link Uint8ClampedArray} instance */ public static Uint8ClampedArray create(ArrayBuffer buffer, int byteOffset, int length) { return new Uint8ClampedArrayNativeEmul(buffer, byteOffset, length); } /** * Create a {@link Uint8ClampedArray} instance from a short array. * * @param array * @return {@link Uint8ClampedArray} instance */ public static Uint8ClampedArray create(short[] array) { int len = array.length; Uint8ClampedArray result = create(ArrayBufferNative.create(len), 0, len); result.set(array); return result; } /** * Create a {@link Uint8ClampedArray} instance from a JavaScript array * containing integers. * * @param array JavaScript array object * @return {@link Uint8ClampedArray} instance */ public static Uint8ClampedArray create(JsArrayInteger array) { int len = array.length(); Uint8ClampedArray result = create(ArrayBufferNative.create(len), 0, len); JsUtils.set(result, array); return result; } private static short clamp(int val) { return (short) Math.max(0, Math.min(val, 255)); } private final Uint8Array real; /** * Internal constructor for creating an {@link Uint8ClampedArrayNativeEmul} * on an existing {@link ArrayBuffer} instance. * * @param buffer * @param byteOffset * @param length */ protected Uint8ClampedArrayNativeEmul(ArrayBuffer buffer, int byteOffset, int length) { real = Uint8ArrayNative.create(buffer, byteOffset, length); } @Override public ArrayBuffer buffer() { return real.buffer(); } @Override public int byteLength() { return real.byteLength(); } @Override public int byteOffset() { return real.byteOffset(); } @Override public short get(int index) { return real.get(index); } @Override public int length() { return real.length(); } @Override public void set(int index, int value) { real.set(index, clamp(value)); } @Override public void set(int[] array) { set(array, 0); } @Override public void set(int[] array, int offset) { int len = array.length; for (int i = 0; i < len; ++i) { real.set(offset++, clamp(array[i])); } } @Override public void set(short[] array) { set(array, 0); } @Override public void set(short[] array, int offset) { int len = array.length; for (int i = 0; i < len; ++i) { real.set(offset++, clamp(array[i])); } } @Override public void set(Uint8Array array) { set(array, 0); } @Override public void set(Uint8Array array, int offset) { int len = array.length(); for (int i = 0; i < len; ++i) { real.set(offset++, clamp(array.get(i))); } } @Override public Uint8ClampedArray subarray(int begin) { return subarray(begin, byteLength()); } @Override public Uint8ClampedArray subarray(int begin, int end) { int len = byteLength(); if (begin < 0) { begin += len; } if (end < 0) { end += len; } if (begin < 0) { begin = 0; } else if (begin > len) { begin = len; } if (end < begin) { end = begin; } else if (end > len) { end = len; } return new Uint8ClampedArrayNativeEmul(buffer(), byteOffset() + begin, end - begin); } }