blob: ad5f26df53662af61ec79970d30dc0738866f730 [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.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);
}
}